116#include "TRestEventTimeSelectionProcess.h"
135 fIsActiveTime =
true;
137 fStartEndTimes.clear();
138 fTimeOffsetInSeconds = 0;
139 fTimeStartMarginInSeconds = 0;
140 fTimeEndMarginInSeconds = 0;
141 fUseRunStartAndEndTimes =
true;
143 fNEventsSelected = 0;
144 fTotalTimeInSeconds = 0;
153 if (!fFileWithTimes.empty()) {
154 fStartEndTimes = ReadFileWithTimes(fFileWithTimes, fDelimiter);
156 if (fUseRunStartAndEndTimes) {
159 auto startTimeStamp = run->GetStartTimestamp();
160 auto endTimeStamp = run->GetEndTimestamp();
161 ApplyStartRunTime(startTimeStamp);
162 ApplyEndRunTime(endTimeStamp);
164 RESTWarning <<
"No run information available to get TRestRun start and end times." <<
RESTendl;
169 fNEventsSelected = 0;
172std::vector<Interval> TRestEventTimeSelectionProcess::ReadFileWithTimes(std::string fileWithTimes,
174 std::vector<Interval> startEndTimes;
176 ifstream file(fileWithTimes);
177 if (file.is_open()) {
178 while (getline(file, line)) {
179 if (line[0] ==
'#') {
182 std::istringstream lineStream(line);
183 std::string startDate, endDate;
184 if (std::getline(lineStream, startDate, delimiter) &&
185 std::getline(lineStream, endDate, delimiter)) {
193 startEndTimes.emplace_back(sts, ets);
200 std::sort(startEndTimes.begin(), startEndTimes.end());
202 return startEndTimes;
211 Double_t totalTime = 0;
212 for (
auto se : fStartEndTimes) {
213 TTimeStamp startTime = se.first;
214 TTimeStamp endTime = se.second;
216 startTime.Add(TTimeStamp(fTimeStartMarginInSeconds));
217 endTime.Add(TTimeStamp(-fTimeEndMarginInSeconds));
218 auto timeDiff = endTime.AsDouble() - startTime.AsDouble();
220 RESTDebug <<
"End time is before start time in time range: " << se.first <<
" to " << se.second
224 totalTime += endTime.AsDouble() - startTime.AsDouble();
235 TTimeStamp eventTime = fEvent->GetTimeStamp();
236 eventTime.Add(TTimeStamp(fTimeOffsetInSeconds));
238 Bool_t isInsideAnyTimeRange =
false;
239 for (
auto se : fStartEndTimes) {
240 TTimeStamp startTime = se.first;
241 TTimeStamp endTime = se.second;
244 startTime.Add(TTimeStamp(fTimeStartMarginInSeconds));
245 endTime.Add(TTimeStamp(-fTimeEndMarginInSeconds));
248 startTime.Add(TTimeStamp(-fTimeStartMarginInSeconds));
249 endTime.Add(TTimeStamp(fTimeEndMarginInSeconds));
252 if (eventTime >= startTime && eventTime <= endTime) {
253 isInsideAnyTimeRange =
true;
261 if (isInsideAnyTimeRange) {
266 if (!isInsideAnyTimeRange) {
285void TRestEventTimeSelectionProcess::ApplyStartRunTime(
const TTimeStamp& runStart) {
286 size_t startIndex = 0;
287 bool isInsideTimeRange =
false;
288 for (
auto se : fStartEndTimes) {
289 TTimeStamp s = se.first;
290 TTimeStamp e = se.second;
293 isInsideTimeRange =
false;
297 if (runStart >= s && runStart <= e) {
298 isInsideTimeRange =
true;
305 if (isInsideTimeRange) {
307 fStartEndTimes[startIndex].first = runStart;
310 fStartEndTimes.erase(fStartEndTimes.begin(), fStartEndTimes.begin() + startIndex);
313void TRestEventTimeSelectionProcess::ApplyEndRunTime(
const TTimeStamp& runEnd) {
315 bool isInsideTimeRange =
false;
316 for (
auto se : fStartEndTimes) {
317 TTimeStamp s = se.first;
318 TTimeStamp e = se.second;
321 isInsideTimeRange =
false;
325 if (runEnd >= s && runEnd <= e) {
326 isInsideTimeRange =
true;
333 if (isInsideTimeRange) {
335 fStartEndTimes[endIndex].second = runEnd;
339 fStartEndTimes.erase(fStartEndTimes.begin() + endIndex, fStartEndTimes.end());
355 Bool_t useMargins, Int_t nTimes) {
356 std::string timeCut =
"";
357 std::string timeStampObsNameWithOffset = timeStampObsName;
358 if (useOffset && fTimeOffsetInSeconds != 0) {
359 timeStampObsNameWithOffset +=
"+" + to_string(fTimeOffsetInSeconds);
361 if (nTimes < 0) nTimes = fStartEndTimes.size();
363 for (
auto se : fStartEndTimes) {
364 if (c++ >= nTimes)
break;
365 auto startTime = se.first;
366 auto endTime = se.second;
371 startTime.Add(fTimeStartMarginInSeconds);
372 endTime.Add(-fTimeEndMarginInSeconds);
375 startTime.Add(-fTimeStartMarginInSeconds);
376 endTime.Add(fTimeEndMarginInSeconds);
380 if (startTime >= endTime) {
385 if (!timeCut.empty()) {
391 if (!fIsActiveTime) timeCut +=
"!";
394 timeCut +=
"(" + timeStampObsNameWithOffset +
">=" + to_string(startTime) +
")";
396 timeCut +=
"(" + timeStampObsNameWithOffset +
"<=" + to_string(endTime) +
")";
406 std::string typeOfTime = fIsActiveTime ?
"Active" :
"Dead";
408 RESTMetadata <<
"File with times: " << fFileWithTimes <<
RESTendl;
410 RESTMetadata <<
"Use run start and end: " << (fUseRunStartAndEndTimes ?
"true" :
"false") <<
RESTendl;
411 RESTMetadata <<
"Offset time: " << fTimeOffsetInSeconds <<
" seconds" <<
RESTendl;
412 RESTMetadata <<
"Start margin time: " << fTimeStartMarginInSeconds <<
" seconds" <<
RESTendl;
413 RESTMetadata <<
"End margin time: " << fTimeEndMarginInSeconds <<
" seconds" <<
RESTendl;
414 RESTMetadata << typeOfTime <<
" time periods: " <<
RESTendl;
415 for (
auto se : fStartEndTimes) {
418 RESTMetadata << startStr <<
" to " << endStr <<
RESTendl;
422 TTimeStamp totalTime = TTimeStamp(fTotalTimeInSeconds, 0);
423 if (!fStartEndTimes.empty()) {
424 TTimeStamp firstTime = fStartEndTimes.front().first;
425 TTimeStamp lastTime = fStartEndTimes.back().second;
426 totalTime = lastTime - firstTime;
429 double fractionOfTime = fTotalTimeInSeconds / totalTime.AsDouble() * 100;
430 std::string fractionOfTimeStr = StringWithPrecision(fractionOfTime, 4) +
" %";
431 if ((Int_t)(fTotalTimeInSeconds / 24 / 3600) != 0)
432 RESTMetadata <<
"Total " << typeOfTime <<
" time: " << fTotalTimeInSeconds / 24 / 3600 <<
" days"
433 <<
" (" << fractionOfTimeStr <<
")" <<
RESTendl;
434 else if ((Int_t)(fTotalTimeInSeconds / 3600) != 0)
435 RESTMetadata <<
"Total " << typeOfTime <<
" time: " << fTotalTimeInSeconds / 3600 <<
" hours"
436 <<
" (" << fractionOfTimeStr <<
")" <<
RESTendl;
437 else if ((Int_t)(fTotalTimeInSeconds / 60) != 0)
438 RESTMetadata <<
"Total " << typeOfTime <<
" time: " << fTotalTimeInSeconds / 60 <<
" minutes"
439 <<
" (" << fractionOfTimeStr <<
")" <<
RESTendl;
441 RESTMetadata <<
"Total " << typeOfTime <<
" time: " << fTotalTimeInSeconds <<
" seconds"
442 <<
" (" << fractionOfTimeStr <<
")" <<
RESTendl;
446 RESTMetadata <<
"Number of events selected: " << fNEventsSelected <<
" ("
TRestRun * GetRunInfo() const
Return the pointer of the hosting TRestRun object.
void BeginPrintProcess()
[name, cut range]
Double_t CalculateTotalTimeInSeconds()
Function to calculate the total time in seconds of all the time ranges (active or dead periods of tim...
TRestEventTimeSelectionProcess()
Default constructor.
void PrintMetadata() override
Prints on screen the process data members.
void EndProcess() override
Function to include required actions after all events have been processed.
Int_t fNEventsRejected
Information about the events processed.
TRestEvent * ProcessEvent(TRestEvent *inputEvent) override
The main processing event function.
void Initialize() override
Function to initialize input/output event members and define the section name.
std::string GetTimeStampCut(std::string timeStampObsName="timeStamp", Bool_t useOffset=true, Bool_t useMargins=true, Int_t nTimes=-1)
Function to get the cut string that reproduce the time selection done by this process (useful for TRe...
void InitProcess() override
Process initialization.
A base class for any REST event.
Data provider and manager in REST.
time_t StringToTimeStamp(std::string time)
A method to convert a date/time formatted string to a timestamp.
std::string ToDateTimeString(time_t time)
Format time_t into string.