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
|
/****************************************************************************
*
* This is a part of TOTEM offline software.
* Authors:
* Jan Kašpar (jan.kaspar@gmail.com)
*
****************************************************************************/
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Utilities/interface/InputTag.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "DataFormats/FEDRawData/interface/FEDRawData.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
#include "DataFormats/CTPPSDigi/interface/TotemTriggerCounters.h"
#include <string>
#include <iostream>
class TotemTriggerRawToDigi : public edm::stream::EDProducer<> {
public:
explicit TotemTriggerRawToDigi(const edm::ParameterSet &);
~TotemTriggerRawToDigi() override;
void produce(edm::Event &, const edm::EventSetup &) override;
private:
unsigned int fedId;
edm::EDGetTokenT<FEDRawDataCollection> fedDataToken;
/// Process one LoneG frame.
int ProcessLoneGFrame(uint64_t *oBuf, unsigned long size, TotemTriggerCounters &data);
};
using namespace edm;
using namespace std;
TotemTriggerRawToDigi::TotemTriggerRawToDigi(const edm::ParameterSet &conf)
: fedId(conf.getParameter<unsigned int>("fedId")) {
fedDataToken = consumes<FEDRawDataCollection>(conf.getParameter<edm::InputTag>("rawDataTag"));
if (fedId == 0)
throw cms::Exception("TotemTriggerRawToDigi")
<< "Invalid FED id for TOTEM trigger. Please specify it through the 'fedId' parameter.";
produces<TotemTriggerCounters>();
}
TotemTriggerRawToDigi::~TotemTriggerRawToDigi() {}
void TotemTriggerRawToDigi::produce(edm::Event &event, const edm::EventSetup &es) {
// raw data handle
edm::Handle<FEDRawDataCollection> rawData;
event.getByToken(fedDataToken, rawData);
// book output products
TotemTriggerCounters totemTriggerCounters;
// unpack trigger data
const FEDRawData &data = rawData->FEDData(fedId);
uint64_t *buf = (uint64_t *)data.data();
unsigned int sizeInWords = data.size() / 8; // bytes -> words
if (data.size() > 0)
ProcessLoneGFrame(buf + 2, sizeInWords - 4, totemTriggerCounters);
// commit products to event
event.put(make_unique<TotemTriggerCounters>(totemTriggerCounters));
}
int TotemTriggerRawToDigi::ProcessLoneGFrame(uint64_t *oBuf, unsigned long size, TotemTriggerCounters &td) {
if (size != 20) {
LogError("Totem") << "Error in TotemTriggerRawToDigi::ProcessLoneGFrame > "
<< "Wrong LoneG frame size: " << size << " (shall be 20)." << endl;
return 1;
}
// buffer mapping: OptoRx buffer --> LoneG buffer
uint64_t buf[5];
for (unsigned int i = 0; i < 5; i++)
buf[i] = 0;
for (unsigned int i = 0; i < 20; i++) {
int row = i / 4;
int col = i % 4;
buf[row] |= (oBuf[i] & 0xFFFF) << (col * 16);
}
td.type = (buf[0] >> 56) & 0xF;
td.event_num = (buf[0] >> 32) & 0xFFFFFF;
td.bunch_num = (buf[0] >> 20) & 0xFFF;
td.src_id = (buf[0] >> 8) & 0xFFF;
td.orbit_num = (buf[1] >> 32) & 0xFFFFFFFF;
td.revision_num = (buf[1] >> 24) & 0xFF;
td.run_num = (buf[2] >> 32) & 0xFFFFFFFF;
td.trigger_num = (buf[2] >> 0) & 0xFFFFFFFF;
td.inhibited_triggers_num = (buf[3] >> 32) & 0xFFFFFFFF;
td.input_status_bits = (buf[3] >> 0) & 0xFFFFFFFF;
#ifdef DEBUG
printf(">> RawDataUnpacker::ProcessLoneGFrame > size = %li\n", size);
printf(
"\ttype = %x, event number = %x, bunch number = %x, id = %x\n", td.type, td.event_num, td.bunch_num, td.src_id);
printf("\torbit number = %x, revision = %x\n", td.orbit_num, td.revision_num);
printf("\trun number = %x, trigger number = %x\n", td.run_num, td.trigger_num);
printf("\tinhibited triggers = %x, input status bits = %x\n", td.inhibited_triggers_num, td.input_status_bits);
#endif
return 0;
}
DEFINE_FWK_MODULE(TotemTriggerRawToDigi);
|