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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
#include "CalibTracker/SiStripESProducers/plugins/fake/SiStripFedCablingFakeESSource.h"
#include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
#include "CalibFormats/SiStripObjects/interface/SiStripFecCabling.h"
#include "CalibFormats/SiStripObjects/interface/SiStripModule.h"
#include "CalibTracker/Records/interface/SiStripHashedDetIdRcd.h"
#include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
#include "CalibTracker/SiStripCommon/interface/SiStripFedIdListReader.h"
#include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
#include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <sstream>
#include <vector>
#include <map>
using namespace sistrip;
// -----------------------------------------------------------------------------
//
SiStripFedCablingFakeESSource::SiStripFedCablingFakeESSource(const edm::ParameterSet& pset)
: SiStripFedCablingESProducer(pset), fedIds_(pset.getParameter<edm::FileInPath>("FedIdsFile")), pset_(pset) {
findingRecord<SiStripFedCablingRcd>();
m_detInfo = SiStripDetInfoFileReader::read(pset.getParameter<edm::FileInPath>("SiStripDetInfoFile").fullPath());
edm::LogVerbatim("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
<< " Constructing object...";
}
// -----------------------------------------------------------------------------
//
SiStripFedCablingFakeESSource::~SiStripFedCablingFakeESSource() {
edm::LogVerbatim("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
<< " Destructing object...";
}
// -----------------------------------------------------------------------------
//
SiStripFedCabling* SiStripFedCablingFakeESSource::make(const SiStripFedCablingRcd&) {
edm::LogVerbatim("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
<< " Building \"fake\" FED cabling map"
<< " from real DetIds and FedIds (read from ascii file)";
// Create FEC cabling object
SiStripFecCabling* fec_cabling = new SiStripFecCabling();
// Read DetId list from file
typedef std::vector<uint32_t> Dets;
Dets dets = m_detInfo.getAllDetIds();
// Read FedId list from file
typedef std::vector<uint16_t> Feds;
Feds feds = SiStripFedIdListReader(fedIds_.fullPath()).fedIds();
bool populateAllFeds = pset_.getParameter<bool>("PopulateAllFeds");
// Iterator through DetInfo objects and populate FEC cabling object
uint32_t imodule = 0;
Dets::const_iterator idet = dets.begin();
Dets::const_iterator jdet = dets.end();
for (; idet != jdet; ++idet) {
uint16_t npairs = m_detInfo.getNumberOfApvsAndStripLength(*idet).first / 2;
for (uint16_t ipair = 0; ipair < npairs; ++ipair) {
uint16_t addr = 0;
if (npairs == 2 && ipair == 0) {
addr = 32;
} else if (npairs == 2 && ipair == 1) {
addr = 36;
} else if (npairs == 3 && ipair == 0) {
addr = 32;
} else if (npairs == 3 && ipair == 1) {
addr = 34;
} else if (npairs == 3 && ipair == 2) {
addr = 36;
} else {
edm::LogWarning("FedCabling") << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
<< " Inconsistent values for nPairs (" << npairs << ") and ipair (" << ipair
<< ")!";
}
uint32_t module_key =
SiStripFecKey(fecCrate(imodule), fecSlot(imodule), fecRing(imodule), ccuAddr(imodule), ccuChan(imodule)).key();
FedChannelConnection conn(fecCrate(imodule),
fecSlot(imodule),
fecRing(imodule),
ccuAddr(imodule),
ccuChan(imodule),
addr,
addr + 1, // apv i2c addresses
module_key, // dcu id
*idet, // det id
npairs); // apv pairs
fec_cabling->addDevices(conn);
}
imodule++;
}
// Assign "dummy" FED ids/chans
bool insufficient = false;
Feds::const_iterator ifed = feds.begin();
uint16_t fed_ch = 0;
for (auto& icrate : fec_cabling->crates()) {
for (auto& ifec : icrate.fecs()) {
for (auto& iring : ifec.rings()) {
for (auto& iccu : iring.ccus()) {
for (auto& imod : iccu.modules()) {
if (populateAllFeds) {
for (uint16_t ipair = 0; ipair < imod.nApvPairs(); ipair++) {
if (ifed == feds.end()) {
fed_ch++;
ifed = feds.begin();
}
if (fed_ch == 96) {
insufficient = true;
break;
}
std::pair<uint16_t, uint16_t> addr = imod.activeApvPair(imod.lldChannel(ipair));
SiStripModule::FedChannel fed_channel((*ifed) / 16 + 1, // 16 FEDs per crate, numbering starts from 1
(*ifed) % 16 + 2, // FED slot starts from 2
*ifed,
fed_ch);
imod.fedCh(addr.first, fed_channel);
ifed++;
}
} else {
// Patch introduced by D.Giordano 2/12/08
//to reproduce the fake cabling used in 2x
//that was designed to fill each fed iteratively
//filling all channels of a fed before going to the next one
if (96 - fed_ch < imod.nApvPairs()) {
ifed++;
fed_ch = 0;
} // move to next FED
for (uint16_t ipair = 0; ipair < imod.nApvPairs(); ipair++) {
std::pair<uint16_t, uint16_t> addr = imod.activeApvPair(imod.lldChannel(ipair));
SiStripModule::FedChannel fed_channel((*ifed) / 16 + 1, // 16 FEDs per crate, numbering starts from 1
(*ifed) % 16 + 2, // FED slot starts from 2
(*ifed),
fed_ch);
imod.fedCh(addr.first, fed_channel);
fed_ch++;
}
}
}
}
}
}
}
if (insufficient) {
edm::LogWarning(mlCabling_) << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
<< " Insufficient FED channels to cable entire system!";
}
// Some debug
std::stringstream ss;
ss << "[SiStripFedCablingFakeESSource::" << __func__ << "]"
<< " First count devices of FEC cabling " << std::endl;
fec_cabling->countDevices().print(ss);
LogTrace(mlCabling_) << ss.str();
// Build FED cabling using FedChannelConnections
std::vector<FedChannelConnection> conns;
fec_cabling->connections(conns);
SiStripFedCabling* cabling = new SiStripFedCabling(conns);
return cabling;
}
// -----------------------------------------------------------------------------
//
void SiStripFedCablingFakeESSource::setIntervalFor(const edm::eventsetup::EventSetupRecordKey& key,
const edm::IOVSyncValue& iov_sync,
edm::ValidityInterval& iov_validity) {
edm::ValidityInterval infinity(iov_sync.beginOfTime(), iov_sync.endOfTime());
iov_validity = infinity;
}
|