1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#ifndef EventFilter_Utilities_DAQSourceModelsScoutingRun3_h
#define EventFilter_Utilities_DAQSourceModelsScoutingRun3_h
#include "EventFilter/Utilities/interface/DAQSource.h"
#include "EventFilter/Utilities/interface/DAQSourceModels.h"
#include "DataFormats/L1ScoutingRawData/interface/SDSRawDataCollection.h"
#include "DataFormats/L1ScoutingRawData/interface/SDSNumbering.h"
#include "FWCore/Framework/interface/Event.h"
#include "DataFormats/Provenance/interface/EventAuxiliary.h"
#include "DataFormats/Provenance/interface/EventID.h"
#include <sys/types.h>
#include <filesystem>
#include <sstream>
#include <iostream>
#include <memory>
#include <vector>
class DataModeScoutingRun3 : public DataMode {
public:
DataModeScoutingRun3(DAQSource* daqSource) : DataMode(daqSource) {}
~DataModeScoutingRun3() override {}
std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>>& makeDaqProvenanceHelpers() override;
void readEvent(edm::EventPrincipal& eventPrincipal) override;
void fillSDSRawDataCollection(SDSRawDataCollection& rawData, char* buff, size_t len);
//reuse FRD file and event headers
int dataVersion() const override { return detectedFRDversion_; }
void detectVersion(unsigned char* fileBuf, uint32_t fileHeaderOffset) override {
detectedFRDversion_ = *((uint16_t*)(fileBuf + fileHeaderOffset));
}
uint32_t headerSize() const override { return edm::streamer::FRDHeaderVersionSize[detectedFRDversion_]; }
bool versionCheck() const override { return detectedFRDversion_ <= edm::streamer::FRDHeaderMaxVersion; }
uint64_t dataBlockSize() const override {
// get event size from the first data source (main)
return events_[0]->size();
}
void makeDataBlockView(unsigned char* addr, RawInputFile* rawFile) override {
std::vector<uint64_t> const& fileSizes = rawFile->fileSizes_;
fileHeaderSize_ = rawFile->rawHeaderSize_;
numFiles_ = fileSizes.size();
// initalize vectors keeping tracks of valid orbits and completed blocks
sourceValidOrbitPair_.clear();
completedBlocks_.clear();
for (unsigned int i = 0; i < fileSizes.size(); i++) {
completedBlocks_.push_back(false);
}
//add offset address for each file payload
dataBlockAddrs_.clear();
dataBlockAddrs_.push_back(addr);
dataBlockMaxAddrs_.clear();
dataBlockMaxAddrs_.push_back(addr + fileSizes[0] - fileHeaderSize_);
auto fileAddr = addr;
for (unsigned int i = 1; i < fileSizes.size(); i++) {
fileAddr += fileSizes[i - 1];
dataBlockAddrs_.push_back(fileAddr);
dataBlockMaxAddrs_.push_back(fileAddr + fileSizes[i] - fileHeaderSize_);
}
dataBlockMax_ = rawFile->currentChunkSize();
blockCompleted_ = false;
//set event cached as we set initial address here
bool result = makeEvents();
assert(result);
eventCached_ = true;
setDataBlockInitialized(true);
}
bool nextEventView(RawInputFile*) override;
bool blockChecksumValid() override { return true; }
bool checksumValid() override;
std::string getChecksumError() const override;
uint32_t run() const override {
assert(!events_.empty());
return events_[0]->run();
}
bool dataBlockCompleted() const override { return blockCompleted_; }
bool requireHeader() const override { return true; }
bool fitToBuffer() const override { return true; }
void unpackFile(RawInputFile* file) override {}
bool dataBlockInitialized() const override { return dataBlockInitialized_; }
void setDataBlockInitialized(bool val) override { dataBlockInitialized_ = val; };
void setTCDSSearchRange(uint16_t MINTCDSuTCAFEDID, uint16_t MAXTCDSuTCAFEDID) override { return; }
void makeDirectoryEntries(std::vector<std::string> const& baseDirs,
std::vector<int> const& numSources,
std::vector<int> const& sourceIDs,
std::string const& sourceIdentifier,
std::string const& runDir) override;
std::pair<bool, std::vector<std::string>> defineAdditionalFiles(std::string const& primaryName,
bool fileListMode) const override;
private:
bool makeEvents();
std::vector<std::shared_ptr<const edm::DaqProvenanceHelper>> daqProvenanceHelpers_; //
uint16_t detectedFRDversion_ = 0;
size_t fileHeaderSize_ = 0;
size_t headerSize_ = 0;
std::vector<std::unique_ptr<edm::streamer::FRDEventMsgView>> events_;
unsigned char* dataBlockAddr_ = nullptr;
std::vector<unsigned char*> dataBlockAddrs_;
std::vector<unsigned char*> dataBlockMaxAddrs_;
size_t dataBlockMax_ = 0;
short numFiles_ = 0;
bool dataBlockInitialized_ = false;
bool blockCompleted_ = true;
bool eventCached_ = false;
std::vector<std::filesystem::path> buPaths_;
std::vector<int> buNumSources_;
// keep track of valid (=aligned) orbits from different data sources
std::vector<std::pair<int, int>> sourceValidOrbitPair_;
unsigned int currOrbit_ = 0xFFFFFFFF;
std::vector<bool> completedBlocks_;
};
#endif // EventFilter_Utilities_DAQSourceModelsScoutingRun3_h
|