Project
Loading...
Searching...
No Matches
EventRecord.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include <string>
13
20
21#include "Framework/Output.h"
29
32
33#include <cassert>
34#include <array>
35#include <string>
36#include <bitset>
37#include <vector>
38#include <gsl/span>
39#include <typeinfo>
40
41namespace o2::trd
42{
43
44void EventRecord::sortData(bool sortDigits)
45{
46 auto ordering = [](const auto& lhs, const auto& rhs) {
47 return (lhs.getDetector() < rhs.getDetector()) ||
48 (lhs.getDetector() == rhs.getDetector() && lhs.getPadRow() < rhs.getPadRow()) ||
49 (lhs.getDetector() == rhs.getDetector() && lhs.getPadRow() == rhs.getPadRow() && lhs.getPadCol() < rhs.getPadCol());
50 };
51 std::sort(mTracklets.begin(), mTracklets.end(), ordering);
52 if (sortDigits) {
53 // after this digits are not strictly ordered by MCM anymore because of shared digits!
54 // not needed for noise runs
55 std::sort(mDigits.begin(), mDigits.end(), ordering);
56 }
57}
58
59void EventRecordContainer::sendData(o2::framework::ProcessingContext& pc, bool generatestats, bool sortDigits, bool sendLinkStats)
60{
61 //at this point we know the total number of tracklets and digits and triggers.
62 auto dataReadStart = std::chrono::high_resolution_clock::now();
63
64 size_t digitcount = 0;
65 size_t trackletcount = 0;
66 std::vector<Tracklet64> tracklets;
67 std::vector<Digit> digits;
68 std::vector<TriggerRecord> triggers;
69 std::vector<DataCountersPerTrigger> counters;
70 for (auto& event : mEventRecords) {
71 event.sortData(sortDigits);
72 tracklets.insert(tracklets.end(), event.getTracklets().begin(), event.getTracklets().end());
73 digits.insert(digits.end(), event.getDigits().begin(), event.getDigits().end());
74 triggers.emplace_back(event.getBCData(), digitcount, event.getDigits().size(), trackletcount, event.getTracklets().size());
75 digitcount += event.getDigits().size();
76 trackletcount += event.getTracklets().size();
77 counters.push_back(event.getCounters());
78 }
79
83 if (generatestats) {
87 }
88 if (sendLinkStats) {
90 }
91
92 std::chrono::duration<double, std::micro> dataReadTime = std::chrono::high_resolution_clock::now() - dataReadStart;
93 LOG(debug) << "Preparing for sending and sending data took " << std::chrono::duration_cast<std::chrono::milliseconds>(dataReadTime).count() << "ms";
94}
95
97{
98 mTFStats.mNTriggersTotal = mEventRecords.size();
99 for (const auto& event : mEventRecords) {
100 mTFStats.mTrackletsFound += event.getTracklets().size();
101 mTFStats.mDigitsFound += event.getDigits().size();
102 mTFStats.mTimeTakenForTracklets += event.getTrackletTime();
103 mTFStats.mTimeTakenForDigits += event.getDigitTime();
104 mTFStats.mTimeTaken += event.getTotalTime();
105 if (event.getIsCalibTrigger()) {
106 ++mTFStats.mNTriggersCalib;
107 }
108 }
109}
110
112{
113 // check if we already have an EventRecord for given interaction
114 bool foundEventRecord = false;
115 for (int idx = 0; idx < (int)mEventRecords.size(); ++idx) {
116 if (mEventRecords.at(idx).getBCData() == ir) {
117 mCurrEventRecord = idx;
118 foundEventRecord = true;
119 }
120 }
121 if (!foundEventRecord) {
122 // we add a new EventRecord
123 mEventRecords.emplace_back(ir);
124 mCurrEventRecord = mEventRecords.size() - 1;
125 }
126}
127
129{
130 mEventRecords.clear();
131 mTFStats.clear();
132}
133} // namespace o2::trd
uint16_t digitcount
Global TRD definitions and constants.
A helper class to iteratate over all parts of all input routes.
std::ostringstream debug
void snapshot(const Output &spec, T const &object)
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
void sendData(o2::framework::ProcessingContext &pc, bool generatestats, bool sortDigits, bool sendLinkStats)
void setCurrentEventRecord(const InteractionRecord &ir)
void sortData(bool sortDigits)
o2::dataformats::TFIDInfo mTFIDInfo
struct _cl_event * event
Definition glcorearb.h:2982
GLint GLint GLsizei GLuint * counters
Definition glcorearb.h:3985
constexpr o2::header::DataOrigin gDataOriginTRD
Definition DataHeader.h:577
static void fillTFIDInfo(o2::framework::ProcessingContext &pc, o2::dataformats::TFIDInfo &ti)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
o2::InteractionRecord ir(0, 0)
std::vector< Digit > digits
std::vector< Tracklet64 > tracklets