1414// / \author daiki.sekihata@cern.ch
1515
1616#include " Common/CCDB/EventSelectionParams.h"
17+ #include " Common/Core/Zorro.h"
1718#include " Common/DataModel/EventSelection.h"
1819
20+ #include < CCDB/BasicCCDBManager.h>
1921#include < Framework/AnalysisDataModel.h>
2022#include < Framework/AnalysisTask.h>
2123#include < Framework/Configurable.h>
@@ -36,11 +38,12 @@ using namespace o2::framework::expressions;
3638struct testPV {
3739
3840 // Configurables
39- // Configurable<std::string> ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
41+ Configurable<std::string> ccdburl{" ccdb-url" , " http://alice-ccdb.cern.ch" , " url of the ccdb repository" };
4042
4143 struct : ConfigurableGroup {
4244 std::string prefix = " eventCut" ;
4345 Configurable<int > cfgEventGeneratorId{" cfgEventGeneratorId" , -1 , " event generator index. e.g. select gap/signal events" };
46+ Configurable<float > cfgChi2PerNcontribMax{" cfgChi2PerNcontribMax" , 1e+10 , " max. chi2/Ncontrib of PV" };
4447 Configurable<float > cfgZvtxMin{" cfgZvtxMin" , -10 .f , " min. Zvtx" };
4548 Configurable<float > cfgZvtxMax{" cfgZvtxMax" , 10 .f , " max. Zvtx" };
4649 Configurable<bool > cfgRequireFT0AND{" cfgRequireFT0AND" , true , " require FT0AND" };
@@ -50,37 +53,53 @@ struct testPV {
5053 Configurable<bool > cfgRequireGoodZvtxFT0vsPV{" cfgRequireGoodZvtxFT0vsPV" , false , " require good Zvtx between FT0 vs. PV in event cut" };
5154 Configurable<bool > cfgRequireVertexITSTPC{" cfgRequireVertexITSTPC" , false , " require Vertex ITSTPC in event cut" }; // ITS-TPC matched track contributes PV.
5255 Configurable<bool > cfgRequireVertexTOFmatched{" cfgRequireVertexTOFmatched" , false , " require Vertex TOFmatched in event cut" }; // ITS-TPC-TOF matched track contributes PV.
56+
5357 // for RCT
5458 o2::framework::Configurable<bool > cfgRequireGoodRCT{" cfgRequireGoodRCT" , true , " require good detector flag in run condtion table" };
5559 o2::framework::Configurable<std::string> cfgRCTLabel{" cfgRCTLabel" , " CBT" , " select 1 [CBT, CBT_hadronPID, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h" };
5660 o2::framework::Configurable<bool > cfgCheckZDC{" cfgCheckZDC" , false , " set ZDC flag for AA" };
5761 o2::framework::Configurable<bool > cfgTreatLimitedAcceptanceAsBad{" cfgTreatLimitedAcceptanceAsBad" , false , " reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance" };
5862 } eventCut;
5963
64+ // for zorro
65+ struct : ConfigurableGroup {
66+ std::string prefix = " zorroGroup" ;
67+ Configurable<std::string> cfgTriggerName{" cfgTriggerName" , " fGlobalDimuon" , " desired software trigger name" };
68+ Configurable<std::string> ccdbPathSoftwareTrigger{" ccdbPathSoftwareTrigger" , " EventFiltering/Zorro/" , " ccdb path for ZORRO objects" };
69+ Configurable<uint64_t > bcMarginForSoftwareTrigger{" bcMarginForSoftwareTrigger" , 100 , " Number of BCs of margin for software triggers" };
70+ } zorroGroup;
71+
6072 HistogramRegistry fRegistry {" fRegistry" };
73+ Zorro zorro;
6174
6275 void init (o2::framework::InitContext&)
6376 {
64- // ccdb->setURL(ccdburl);
65- // ccdb->setCaching(true);
66- // ccdb->setLocalObjectValidityChecking();
67- // ccdb->setFatalWhenNull(false);
77+ ccdb->setURL (ccdburl);
78+ ccdb->setCaching (true );
79+ ccdb->setLocalObjectValidityChecking ();
80+ ccdb->setFatalWhenNull (false );
6881
6982 mRunNumber = 0 ;
7083
7184 addHistograms ();
7285 }
7386
7487 int mRunNumber {0 };
75- // Service<o2::ccdb::BasicCCDBManager> ccdb;
88+ Service<o2::ccdb::BasicCCDBManager> ccdb;
7689
77- template <typename TBC >
90+ template <bool isTriggerAnalysis, typename TBC >
7891 void initCCDB (TBC const & bc)
7992 {
8093 if (mRunNumber == bc.runNumber ()) {
8194 return ;
8295 }
8396
97+ if constexpr (isTriggerAnalysis) {
98+ zorro.setCCDBpath (zorroGroup.ccdbPathSoftwareTrigger );
99+ zorro.setBCtolerance (zorroGroup.bcMarginForSoftwareTrigger ); // this does nothing.
100+ zorro.initCCDB (ccdb.service , bc.runNumber (), bc.timestamp (), zorroGroup.cfgTriggerName .value );
101+ }
102+
84103 mRunNumber = bc.runNumber ();
85104 }
86105
@@ -136,6 +155,9 @@ struct testPV {
136155 if (eventCut.cfgRequireVertexTOFmatched && !collision.selection_bit (o2::aod::evsel::kIsVertexTOFmatched )) {
137156 return false ;
138157 }
158+ if (collision.chi2 () / collision.numContrib () > eventCut.cfgChi2PerNcontribMax ) {
159+ return false ;
160+ }
139161 return true ;
140162 }
141163
@@ -155,12 +177,12 @@ struct testPV {
155177 fRegistry .fill (HIST (" Vertex/hCollisionTimeRes" ), collision.numContrib (), collision.collisionTimeRes ());
156178 }
157179
158- template <bool isMC, typename TBCs, typename TCollisions, typename TMCCollisions, typename TMCParticles>
180+ template <bool isMC, bool isTriggerAnalysis, typename TBCs, typename TCollisions, typename TMCCollisions, typename TMCParticles>
159181 void run (TBCs const &, TCollisions const & collisions, TMCCollisions const &, TMCParticles const &)
160182 {
161183 for (const auto & collision : collisions) {
162184 auto bc = collision.template bc_as <TBCs>();
163- initCCDB (bc);
185+ initCCDB<isTriggerAnalysis> (bc);
164186
165187 if constexpr (isMC) {
166188 if (!collision.has_mcCollision ()) {
@@ -172,6 +194,12 @@ struct testPV {
172194 }
173195 }
174196
197+ if constexpr (isTriggerAnalysis) {
198+ if (!zorro.isSelected (bc.globalBC (), zorroGroup.bcMarginForSoftwareTrigger )) { // triggered event
199+ continue ;
200+ }
201+ }
202+
175203 fRegistry .fill (HIST (" hCollisionCounter" ), 1 );
176204
177205 if (!isSelectedCollision (collision)) {
@@ -190,21 +218,29 @@ struct testPV {
190218 } // end of collision loop
191219 }
192220
193- using MyCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels>;
221+ using MyCollisions = soa::Join<aod::Collisions, aod::EvSels>;
222+ using MyCollisionsMC = soa::Join<MyCollisions, aod::McCollisionLabels>;
194223 using MyBCs = soa::Join<aod::BCsWithTimestamps, aod::BcSels>;
195224
196225 Filter collisionFilter_evsel = eventCut.cfgZvtxMin < o2::aod::collision::posZ && o2::aod::collision::posZ < eventCut.cfgZvtxMax;
197226 using FilteredMyCollisions = soa::Filtered<MyCollisions>;
227+ using FilteredMyCollisionsMC = soa::Filtered<MyCollisionsMC>;
198228
199229 void processData (FilteredMyCollisions const & collisions, MyBCs const & bcs)
200230 {
201- run<false >(bcs, collisions, nullptr , nullptr );
231+ run<false , false >(bcs, collisions, nullptr , nullptr );
202232 }
203233 PROCESS_SWITCH (testPV, processData, " processData" , true );
204234
205- void processMC (FilteredMyCollisions const & collisions, MyBCs const & bcs, aod::McCollisions const & mcCollisions, aod::McParticles const & mcParticles)
235+ void processTriggeredData (FilteredMyCollisions const & collisions, MyBCs const & bcs)
236+ {
237+ run<false , true >(bcs, collisions, nullptr , nullptr );
238+ }
239+ PROCESS_SWITCH (testPV, processTriggeredData, " processTriggeredData" , true );
240+
241+ void processMC (FilteredMyCollisionsMC const & collisions, MyBCs const & bcs, aod::McCollisions const & mcCollisions, aod::McParticles const & mcParticles)
206242 {
207- run<true >(bcs, collisions, mcCollisions, mcParticles);
243+ run<true , false >(bcs, collisions, mcCollisions, mcParticles);
208244 }
209245 PROCESS_SWITCH (testPV, processMC, " processMC" , false );
210246
0 commit comments