3434#include " Framework/ConfigParamSpec.h"
3535#include " DataFormatsMCH/TrackMCH.h"
3636#include " DataFormatsMCH/ROFRecord.h"
37+ #include < EventVisualisationBase/DirectoryLoader.h>
3738#include " DataFormatsMCH/Cluster.h"
3839#include < unistd.h>
3940
41+ using std::chrono::duration_cast;
42+ using std::chrono::milliseconds;
43+ using std::chrono::system_clock;
44+
4045using namespace o2 ::event_visualisation;
4146using namespace o2 ::framework;
4247using namespace o2 ::dataformats;
@@ -59,6 +64,7 @@ void customize(std::vector<ConfigParamSpec>& workflowOptions)
5964 {" eve-dds-collection-index" , VariantType::Int, -1 , {" number of dpl collection allowed to produce files (-1 means no limit)" }},
6065 {" number-of_files" , VariantType::Int, 150 , {" maximum number of json files in folder" }},
6166 {" number-of_tracks" , VariantType::Int, -1 , {" maximum number of track stored in json file (-1 means no limit)" }},
67+ {" number-of_bytes" , VariantType::Int, 3000000 , {" number of bytes stored in time interval which stops producing new data file (-1 means no limit)" }},
6268 {" time-interval" , VariantType::Int, 5000 , {" time interval in milliseconds between stored files" }},
6369 {" disable-mc" , VariantType::Bool, false , {" disable visualization of MC data" }},
6470 {" disable-write" , VariantType::Bool, false , {" disable writing output files" }},
@@ -118,7 +124,7 @@ void O2DPLDisplaySpec::run(ProcessingContext& pc)
118124 if (elapsed < this ->mTimeInterval ) {
119125 return ; // skip this run - it is too often
120126 }
121- this ->mTimeStamp = currentTime;
127+ this ->mTimeStamp = currentTime; // next run AFTER period counted from last run, even if there will be not any save
122128 o2::globaltracking::RecoContainer recoCont;
123129 recoCont.collectData (pc, *mDataRequest );
124130 updateTimeDependentParams (pc); // Make sure that this is called after the RecoContainer collect data, since some condition objects are fetched there
@@ -158,12 +164,24 @@ void O2DPLDisplaySpec::run(ProcessingContext& pc)
158164 const auto & tinfo = pc.services ().get <o2::framework::TimingInfo>();
159165
160166 std::size_t filesSaved = 0 ;
167+ const std::vector<std::string> dirs = o2::event_visualisation::DirectoryLoader::allFolders (this ->mJsonPath );
168+ const std::string marker = " _" ;
169+ const std::vector<std::string> exts = {
170+ " .json" , " .root" , " .eve" };
161171 auto processData = [&](const auto & dataMap) {
162172 for (const auto & keyVal : dataMap) {
163173 if (filesSaved >= mMaxPrimaryVertices ) {
164174 break ;
165175 }
166-
176+ if (this ->mNumberOfBytes != -1 ) {
177+ auto periodStart =
178+ duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count () - this ->mTimeInterval .count ();
179+ if (!DirectoryLoader::canCreateNextFile (
180+ dirs, marker, exts, periodStart, this ->mNumberOfBytes )) {
181+ LOGF (info, " Already too much data (> %d) to transfer in this period - event will not be not saved ..." , this ->mNumberOfBytes );
182+ break ;
183+ }
184+ }
167185 const auto pv = keyVal.first ;
168186 bool save = false ;
169187 if (mPrimaryVertexMode ) {
@@ -202,6 +220,8 @@ void O2DPLDisplaySpec::run(ProcessingContext& pc)
202220 helper.mEvent .setPrimaryVertex (pv);
203221 helper.save (this ->mJsonPath , this ->mExt , this ->mNumberOfFiles , this ->mTrkMask , this ->mClMask , tinfo.runNumber , tinfo.creation );
204222 filesSaved++;
223+ currentTime = std::chrono::high_resolution_clock::now (); // time AFTER save
224+ this ->mTimeStamp = currentTime; // next run AFTER period counted from last save
205225 }
206226
207227 helper.clear ();
@@ -318,6 +338,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
318338 std::chrono::milliseconds timeInterval (cfgc.options ().get <int >(" time-interval" ));
319339 int numberOfFiles = cfgc.options ().get <int >(" number-of_files" );
320340 int numberOfTracks = cfgc.options ().get <int >(" number-of_tracks" );
341+ int numberOfBytes = cfgc.options ().get <int >(" number-of_bytes" );
321342
322343 GlobalTrackID::mask_t srcTrk = GlobalTrackID::getSourcesMask (cfgc.options ().get <std::string>(" display-tracks" ));
323344 GlobalTrackID::mask_t srcCl = GlobalTrackID::getSourcesMask (cfgc.options ().get <std::string>(" display-clusters" ));
@@ -430,7 +451,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
430451 " o2-eve-export" ,
431452 dataRequest->inputs ,
432453 {},
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)}});
454+ AlgorithmSpec{adaptFromTask<O2DPLDisplaySpec>(disableWrite, useMC, srcTrk, srcCl, dataRequest, ggRequest, emcalCalibLoader, jsonFolder, ext, timeInterval, numberOfFiles, numberOfTracks, numberOfBytes, eveHostNameMatch, minITSTracks, minTracks, filterITSROF, filterTime, timeBracket, removeTPCEta, etaBracket, tracksSorting, onlyNthEvent, primaryVertexMode, maxPrimaryVertices, primaryVertexTriggers, primaryVertexMinZ, primaryVertexMaxZ, primaryVertexMinX, primaryVertexMaxX, primaryVertexMinY, primaryVertexMaxY, maxEMCALCellTime, minEMCALCellEnergy)}});
434455
435456 // configure dpl timer to inject correct firstTForbit: start from the 1st orbit of TF containing 1st sampled orbit
436457 o2::raw::HBFUtilsInitializer hbfIni (cfgc, specs);
0 commit comments