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
|
#include "EventFilter/DTRawToDigi/plugins/DTDigiToRawModule.h"
#include "EventFilter/DTRawToDigi/plugins/DTDigiToRaw.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
#include "DataFormats/Common/interface/Handle.h"
#include "FWCore/Framework/interface/Event.h"
#include "DataFormats/FEDRawData/interface/FEDHeader.h"
#include "DataFormats/FEDRawData/interface/FEDTrailer.h"
#include "FWCore/Utilities/interface/CRC16.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include <iostream>
using namespace edm;
using namespace std;
DTDigiToRawModule::DTDigiToRawModule(const edm::ParameterSet& ps) {
produces<FEDRawDataCollection>();
dduID = ps.getUntrackedParameter<int>("dduID", 770);
debug = ps.getUntrackedParameter<bool>("debugMode", false);
digicoll = consumes<DTDigiCollection>(ps.getParameter<edm::InputTag>("digiColl"));
mapToken_ = esConsumes<DTReadOutMapping, DTReadOutMappingRcd>();
useStandardFEDid_ = ps.getUntrackedParameter<bool>("useStandardFEDid", true);
minFEDid_ = ps.getUntrackedParameter<int>("minFEDid", 770);
maxFEDid_ = ps.getUntrackedParameter<int>("maxFEDid", 775);
packer = new DTDigiToRaw(ps);
if (debug)
cout << "[DTDigiToRawModule]: constructor" << endl;
}
DTDigiToRawModule::~DTDigiToRawModule() {
delete packer;
if (debug)
cout << "[DTDigiToRawModule]: destructor" << endl;
}
void DTDigiToRawModule::produce(Event& e, const EventSetup& iSetup) {
auto fed_buffers = std::make_unique<FEDRawDataCollection>();
// Take digis from the event
Handle<DTDigiCollection> digis;
e.getByToken(digicoll, digis);
// Load DTMap
edm::ESHandle<DTReadOutMapping> map = iSetup.getHandle(mapToken_);
// Create the packed data
int FEDIDmin = 0, FEDIDMax = 0;
if (useStandardFEDid_) {
FEDIDmin = FEDNumbering::MINDTFEDID;
FEDIDMax = FEDNumbering::MAXDTFEDID;
} else {
FEDIDmin = minFEDid_;
FEDIDMax = maxFEDid_;
}
for (int id = FEDIDmin; id <= FEDIDMax; ++id) {
packer->SetdduID(id);
FEDRawData* rawData = packer->createFedBuffers(*digis, map);
FEDRawData& fedRawData = fed_buffers->FEDData(id);
fedRawData = *rawData;
delete rawData;
FEDHeader dtFEDHeader(fedRawData.data());
dtFEDHeader.set(fedRawData.data(), 0, e.id().event(), 0, id);
FEDTrailer dtFEDTrailer(fedRawData.data() + (fedRawData.size() - 8));
dtFEDTrailer.set(fedRawData.data() + (fedRawData.size() - 8),
fedRawData.size() / 8,
evf::compute_crc(fedRawData.data(), fedRawData.size()),
0,
0);
}
// Put the raw data to the event
e.put(std::move(fed_buffers));
}
|