2626#include " TOFBase/Geo.h"
2727#include " TPCFastTransform.h"
2828#include " TRDBase/Geometry.h"
29+ #include " EMCALCalib/CellRecalibrator.h"
30+ #include " EMCALWorkflow/CalibLoader.h"
2931#include " GlobalTrackingWorkflowHelpers/InputHelper.h"
3032#include " ReconstructionDataFormats/GlobalTrackID.h"
3133#include " ReconstructionDataFormats/PrimaryVertex.h"
@@ -76,6 +78,9 @@ void customize(std::vector<ConfigParamSpec>& workflowOptions)
7678 {" primary-vertex-mode" , VariantType::Bool, false , {" produce jsons with individual primary vertices, not total time frame data" }},
7779 {" max-primary-vertices" , VariantType::Int, 5 , {" maximum number of primary vertices to draw per time frame" }},
7880 {" primary-vertex-triggers" , VariantType::Bool, false , {" instead of drawing vertices with tracks (and maybe calorimeter triggers), draw vertices with calorimeter triggers (and maybe tracks)" }},
81+ {" no-calibrate-emcal" , VariantType::Bool, false , {" Do not apply on-the-fly EMCAL calibration" }},
82+ {" emcal-max-celltime" , VariantType::Float, 100 .f , {" Max. EMCAL cell time (in ns)" }},
83+ {" emcal-min-cellenergy" , VariantType::Float, 0 .3f , {" Min. EMCAL cell energy (in GeV)" }},
7984 {" primary-vertex-min-z" , VariantType::Float, -o2::constants::math::VeryBig, {" minimum z position for primary vertex" }},
8085 {" primary-vertex-max-z" , VariantType::Float, o2::constants::math::VeryBig, {" maximum z position for primary vertex" }},
8186 {" primary-vertex-min-x" , VariantType::Float, -o2::constants::math::VeryBig, {" minimum x position for primary vertex" }},
@@ -93,6 +98,9 @@ void O2DPLDisplaySpec::init(InitContext& ic)
9398 LOGF (info, " ------------------------ O2DPLDisplay::init version " , o2_eve_version, " ------------------------------------" );
9499 mData .mConfig .configProcessing .runMC = mUseMC ;
95100 o2::base::GRPGeomHelper::instance ().setRequest (mGGCCDBRequest );
101+ if (mEMCALCalibLoader ) {
102+ mEMCALCalibrator = std::make_unique<o2::emcal::CellRecalibrator>();
103+ }
96104}
97105
98106void O2DPLDisplaySpec::run (ProcessingContext& pc)
@@ -114,6 +122,19 @@ void O2DPLDisplaySpec::run(ProcessingContext& pc)
114122 o2::globaltracking::RecoContainer recoCont;
115123 recoCont.collectData (pc, *mDataRequest );
116124 updateTimeDependentParams (pc); // Make sure that this is called after the RecoContainer collect data, since some condition objects are fetched there
125+ if (mEMCALCalibLoader ) {
126+ mEMCALCalibLoader ->checkUpdates (pc);
127+ if (mEMCALCalibLoader ->hasUpdateBadChannelMap ()) {
128+ mEMCALCalibrator ->setBadChannelMap (mEMCALCalibLoader ->getBadChannelMap ());
129+ }
130+ if (mEMCALCalibLoader ->hasUpdateTimeCalib ()) {
131+ mEMCALCalibrator ->setTimeCalibration (mEMCALCalibLoader ->getTimeCalibration ());
132+ }
133+ if (mEMCALCalibLoader ->hasUpdateGainCalib ()) {
134+ mEMCALCalibrator ->setGainCalibration (mEMCALCalibLoader ->getGainCalibration ());
135+ }
136+ }
137+
117138 EveWorkflowHelper::FilterSet enabledFilters;
118139
119140 enabledFilters.set (EveWorkflowHelper::Filter::ITSROF, this ->mFilterITSROF );
@@ -122,6 +143,12 @@ void O2DPLDisplaySpec::run(ProcessingContext& pc)
122143 enabledFilters.set (EveWorkflowHelper::Filter::TotalNTracks, this ->mNumberOfTracks != -1 );
123144 EveWorkflowHelper helper (enabledFilters, this ->mNumberOfTracks , this ->mTimeBracket , this ->mEtaBracket , this ->mPrimaryVertexMode );
124145 helper.setRecoContainer (&recoCont);
146+ if (mEMCALCalibrator ) {
147+ helper.setEMCALCellRecalibrator (mEMCALCalibrator .get ());
148+ }
149+ helper.setMaxEMCALCellTime (mEMCALMaxCellTime );
150+ helper.setMinEMCALCellEnergy (mEMCALMinCellEnergy );
151+
125152 helper.setITSROFs ();
126153 helper.selectTracks (&(mData .mConfig .configCalib ), mClMask , mTrkMask , mTrkMask );
127154 helper.selectTowers ();
@@ -240,6 +267,9 @@ void O2DPLDisplaySpec::finaliseCCDB(ConcreteDataMatcher& matcher, void* obj)
240267 if (o2::base::GRPGeomHelper::instance ().finaliseCCDB (matcher, obj)) {
241268 return ;
242269 }
270+ if (mEMCALCalibLoader && mEMCALCalibLoader ->finalizeCCDB (matcher, obj)) {
271+ return ;
272+ }
243273 if (matcher == ConcreteDataMatcher (" ITS" , " CLUSDICT" , 0 )) {
244274 LOGF (info, " ITS cluster dictionary updated" );
245275 mData .setITSDict ((const o2::itsmft::TopologyDictionary*)obj);
@@ -372,6 +402,8 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
372402 auto primaryVertexMaxX = cfgc.options ().get <float >(" primary-vertex-max-x" );
373403 auto primaryVertexMinY = cfgc.options ().get <float >(" primary-vertex-min-y" );
374404 auto primaryVertexMaxY = cfgc.options ().get <float >(" primary-vertex-max-y" );
405+ auto maxEMCALCellTime = cfgc.options ().get <float >(" emcal-max-celltime" );
406+ auto minEMCALCellEnergy = cfgc.options ().get <float >(" emcal-min-cellenergy" );
375407
376408 if (numberOfTracks == -1 ) {
377409 tracksSorting = false ; // do not sort if all tracks are allowed
@@ -385,11 +417,20 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
385417 dataRequest->inputs ,
386418 true ); // query only once all objects except mag.field
387419
420+ std::shared_ptr<o2::emcal::CalibLoader> emcalCalibLoader;
421+ if (!cfgc.options ().get <bool >(" no-calibrate-emcal" )) {
422+ emcalCalibLoader = std::make_shared<o2::emcal::CalibLoader>();
423+ emcalCalibLoader->enableTimeCalib (true );
424+ emcalCalibLoader->enableBadChannelMap (true );
425+ emcalCalibLoader->enableGainCalib (true );
426+ emcalCalibLoader->defineInputSpecs (dataRequest->inputs );
427+ }
428+
388429 specs.emplace_back (DataProcessorSpec{
389430 " o2-eve-export" ,
390431 dataRequest->inputs ,
391432 {},
392- AlgorithmSpec{adaptFromTask<O2DPLDisplaySpec>(disableWrite, useMC, srcTrk, srcCl, dataRequest, ggRequest, jsonFolder, ext, timeInterval, numberOfFiles, numberOfTracks, eveHostNameMatch, minITSTracks, minTracks, filterITSROF, filterTime, timeBracket, removeTPCEta, etaBracket, tracksSorting, onlyNthEvent, primaryVertexMode, maxPrimaryVertices, primaryVertexTriggers, primaryVertexMinZ, primaryVertexMaxZ, primaryVertexMinX, primaryVertexMaxX, primaryVertexMinY, primaryVertexMaxY)}});
433+ AlgorithmSpec{adaptFromTask<O2DPLDisplaySpec>(disableWrite, useMC, srcTrk, srcCl, dataRequest, ggRequest, emcalCalibLoader, jsonFolder, ext, timeInterval, numberOfFiles, numberOfTracks, eveHostNameMatch, minITSTracks, minTracks, filterITSROF, filterTime, timeBracket, removeTPCEta, etaBracket, tracksSorting, onlyNthEvent, primaryVertexMode, maxPrimaryVertices, primaryVertexTriggers, primaryVertexMinZ, primaryVertexMaxZ, primaryVertexMinX, primaryVertexMaxX, primaryVertexMinY, primaryVertexMaxY, maxEMCALCellTime, minEMCALCellEnergy )}});
393434
394435 // configure dpl timer to inject correct firstTForbit: start from the 1st orbit of TF containing 1st sampled orbit
395436 o2::raw::HBFUtilsInitializer hbfIni (cfgc, specs);
0 commit comments