2727#include " Common/DataModel/Multiplicity.h"
2828#include " Common/DataModel/PIDResponse.h"
2929#include " Common/DataModel/TrackSelectionTables.h"
30+ #include " EventFiltering/Zorro.h"
3031
3132#include " CCDB/BasicCCDBManager.h"
3233#include " CommonConstants/PhysicsConstants.h"
@@ -75,7 +76,8 @@ struct TreeCreatorElectronMLDDA {
7576 HistogramRegistry registry{
7677 " registry" ,
7778 {
78- {" hEventCounter" , " hEventCounter" , {HistType::kTH1F , {{5 , 0 .5f , 5 .5f }}}},
79+ {" Event/hEventCounter" , " hEventCounter" , {HistType::kTH1F , {{5 , 0 .5f , 5 .5f }}}},
80+ {" Event/hNumContrib" , " Number of contributors to PV;N_{contrib}^{PV};Entries" , {HistType::kTH1F , {{65001 , -0 .5f , 65000 .5f }}}},
7981 {" V0/hAP" , " Armenteros Podolanski" , {HistType::kTH2F , {{200 , -1 .f , +1 .f }, {250 , 0 , 0.25 }}}},
8082 {" V0/hXY_Gamma" , " photon conversion point in XY;X (cm);Y (cm)" , {HistType::kTH2F , {{400 , -100 , +100 }, {400 , -100 , +100 }}}},
8183 {" V0/hMassGamma_Rxy" , " V0 mass gamma" , {HistType::kTH2F , {{200 , 0 , 100 }, {100 , 0 , 0.1 }}}},
@@ -123,6 +125,12 @@ struct TreeCreatorElectronMLDDA {
123125 Configurable<double > d_bz_input{" d_bz_input" , -999 , " bz field, -999 is automatic" };
124126 Configurable<int > useMatCorrType{" useMatCorrType" , 2 , " 0: none, 1: TGeo, 2: LUT" };
125127
128+ // for zorro
129+ Configurable<std::string> cfg_swt_names{" cfg_swt_names" , " fHighTrackMult,fHighFt0cFv0Mult" , " comma-separated software trigger names" };
130+ o2::framework::Configurable<std::string> ccdbPathSoftwareTrigger{" ccdbPathSoftwareTrigger" , " EventFiltering/Zorro/" , " ccdb path for ZORRO objects" };
131+ Configurable<uint64_t > bcMarginForSoftwareTrigger{" bcMarginForSoftwareTrigger" , 100 , " Number of BCs of margin for software triggers" };
132+ Configurable<bool > cfgUseZorro{" cfgUseZorro" , false , " flag to analyze software-triggered data" };
133+
126134 Configurable<float > downscaling_electron_highP{" downscaling_electron_highP" , 1.1 , " down scaling factor to store electron at high p" };
127135 Configurable<float > downscaling_pion_highP{" downscaling_pion_highP" , 1.1 , " down scaling factor to store pion at high p" };
128136 Configurable<float > downscaling_kaon_highP{" downscaling_kaon_highP" , 1.1 , " down scaling factor to store kaon at high p" };
@@ -167,6 +175,8 @@ struct TreeCreatorElectronMLDDA {
167175 Configurable<bool > cfgRequireGoodITSLayer3{" cfgRequireGoodITSLayer3" , false , " number of inactive chips on ITS layer 3 are below threshold " };
168176 Configurable<bool > cfgRequireGoodITSLayer0123{" cfgRequireGoodITSLayer0123" , false , " number of inactive chips on ITS layers 0-3 are below threshold " };
169177 Configurable<bool > cfgRequireGoodITSLayersAll{" cfgRequireGoodITSLayersAll" , false , " number of inactive chips on all ITS layers are below threshold " };
178+ Configurable<uint16_t > cfgNumContribMin{" cfgNumContribMin" , 0 , " min. numContrib" };
179+ Configurable<uint16_t > cfgNumContribMax{" cfgNumContribMax" , 65000 , " max. numContrib" };
170180 } eventcuts;
171181
172182 struct : ConfigurableGroup {
@@ -287,6 +297,7 @@ struct TreeCreatorElectronMLDDA {
287297 o2::base::MatLayerCylSet* lut = nullptr ;
288298 o2::dataformats::DCA mDcaInfoCov ;
289299 o2::aod::rctsel::RCTFlagsChecker rctChecker;
300+ Zorro zorro;
290301
291302 std::mt19937 engine;
292303 std::uniform_real_distribution<float > dist01;
@@ -325,6 +336,13 @@ struct TreeCreatorElectronMLDDA {
325336 return ;
326337 }
327338
339+ if (cfgUseZorro) {
340+ zorro.setCCDBpath (ccdbPathSoftwareTrigger);
341+ zorro.setBCtolerance (bcMarginForSoftwareTrigger); // this does nothing.
342+ zorro.initCCDB (ccdb.service , bc.runNumber (), bc.timestamp (), cfg_swt_names.value );
343+ zorro.populateHistRegistry (registry, bc.runNumber ());
344+ }
345+
328346 // load matLUT for this timestamp
329347 if (!lut) {
330348 LOG (info) << " Loading material look-up table for timestamp: " << bc.timestamp ();
@@ -762,6 +780,7 @@ struct TreeCreatorElectronMLDDA {
762780
763781 Filter collisionFilter_track_occupancy = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax;
764782 Filter collisionFilter_ft0c_occupancy = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax;
783+ Filter collisionFilter_numContrib = eventcuts.cfgNumContribMin <= o2::aod::collision::numContrib && o2::aod::collision::numContrib < eventcuts.cfgNumContribMax;
765784 Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10 .f && o2::aod::evsel::sel8 == true ;
766785 using filteredMyCollisions = soa::Filtered<MyCollisions>;
767786
@@ -777,7 +796,7 @@ struct TreeCreatorElectronMLDDA {
777796 {
778797 stored_trackIds.reserve (tracks.size ());
779798 for (const auto & collision : collisions) {
780- registry.fill (HIST (" hEventCounter" ), 1.0 ); // all
799+ registry.fill (HIST (" Event/ hEventCounter" ), 1.0 ); // all
781800
782801 auto bc = collision.template foundBC_as <aod::BCsWithTimestamps>();
783802 initCCDB (bc);
@@ -786,10 +805,15 @@ struct TreeCreatorElectronMLDDA {
786805 continue ;
787806 }
788807
808+ if (cfgUseZorro && !zorro.isSelected (bc.globalBC (), bcMarginForSoftwareTrigger)) {
809+ continue ;
810+ }
811+
789812 if (cfgRequireGoodRCT && !rctChecker.checkTable (collision)) {
790813 continue ;
791814 }
792- registry.fill (HIST (" hEventCounter" ), 2.0 ); // selected
815+ registry.fill (HIST (" Event/hEventCounter" ), 2.0 ); // selected
816+ registry.fill (HIST (" Event/hNumContrib" ), collision.numContrib ());
793817
794818 auto v0s_coll = v0s.sliceBy (perCollision_v0, collision.globalIndex ());
795819 for (const auto & v0 : v0s_coll) {
0 commit comments