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
|
#include "DataFormats/EcalDetId/interface/EcalElectronicsId.h"
#include "FWCore/Utilities/interface/Exception.h"
#include <ostream>
EcalElectronicsId::EcalElectronicsId() { EcalElectronicsId_ = 0xFFFFFFFFu; }
EcalElectronicsId::EcalElectronicsId(uint32_t id) { EcalElectronicsId_ = id; }
EcalElectronicsId::EcalElectronicsId(int dccid, int towerid, int stripid, int xtalid) {
if ((dccid < MIN_DCCID) || (dccid > MAX_DCCID) || (towerid < MIN_TOWERID) || (towerid > MAX_TOWERID) ||
(stripid < MIN_STRIPID) || (stripid > MAX_STRIPID) || (xtalid < MIN_XTALID) || (xtalid > MAX_XTALID))
throw cms::Exception("InvalidDetId")
<< "EcalElectronicsId: Cannot create object. Indexes out of bounds. Dcc tower strip xtal " << dccid << " "
<< towerid << " " << stripid << " " << xtalid << ".";
EcalElectronicsId_ = (xtalid & 0x7) | ((stripid & 0x7) << 3) | ((towerid & 0x7F) << 6) | ((dccid & 0x7F) << 13);
}
EcalSubdetector EcalElectronicsId::subdet() const {
int dcc = dccId();
if ((dcc >= MIN_DCCID_EBM && dcc <= MAX_DCCID_EBM) || (dcc >= MIN_DCCID_EBP && dcc <= MAX_DCCID_EBP))
return EcalBarrel;
else
return EcalEndcap;
}
int EcalElectronicsId::zside() const {
int dcc = dccId();
if ((dcc >= MIN_DCCID_EEM && dcc <= MAX_DCCID_EEM))
return -1;
if ((dcc >= MIN_DCCID_EBM && dcc <= MAX_DCCID_EBM))
return -1;
if ((dcc >= MIN_DCCID_EEP && dcc <= MAX_DCCID_EEP))
return +1;
if ((dcc >= MIN_DCCID_EBP && dcc <= MAX_DCCID_EBP))
return +1;
return 0;
}
static int EEQuadrant(int dcc, int dcc_channel) {
// Q1 = EE+N or EE-F, Top
// Q2 = EE+F or EE-N, Top
// Q3 = EE+F or EE-N, Bottom
// Q4 = EE+N or EE-F, Bottom
// (local notation)
// in Q1-Q3 and in Q2-Q4, the relation between strip#, channel# and xtal_id
// is the same
int q = -1;
if ((dcc == EcalElectronicsId::DCC_EEP + 1) || (dcc == EcalElectronicsId::DCC_EEP + 2) ||
(dcc == EcalElectronicsId::DCC_EEP && dcc_channel <= EcalElectronicsId::kDCCChannelBoundary) ||
(dcc == EcalElectronicsId::DCC_EEM + 3) || (dcc == EcalElectronicsId::DCC_EEM + 4) ||
(dcc == EcalElectronicsId::DCC_EEM + 5 && dcc_channel <= EcalElectronicsId::kDCCChannelBoundary))
q = 1;
else if ((dcc == EcalElectronicsId::DCC_EEP + 3) || (dcc == EcalElectronicsId::DCC_EEP + 4) ||
(dcc == EcalElectronicsId::DCC_EEP + 5 && dcc_channel <= EcalElectronicsId::kDCCChannelBoundary) ||
(dcc == EcalElectronicsId::DCC_EEM && dcc_channel <= EcalElectronicsId::kDCCChannelBoundary) ||
(dcc == EcalElectronicsId::DCC_EEM + 1) || (dcc == EcalElectronicsId::DCC_EEM + 2))
q = 2;
else if ((dcc == EcalElectronicsId::DCC_EEP + 6) ||
(dcc == EcalElectronicsId::DCC_EEP + 5 && dcc_channel > EcalElectronicsId::kDCCChannelBoundary) ||
(dcc == EcalElectronicsId::DCC_EEP + 7 && dcc_channel > EcalElectronicsId::kDCCChannelBoundary) ||
(dcc == EcalElectronicsId::DCC_EEM && dcc_channel > EcalElectronicsId::kDCCChannelBoundary) ||
(dcc == EcalElectronicsId::DCC_EEM + 8) ||
(dcc == EcalElectronicsId::DCC_EEM + 7 && dcc_channel > EcalElectronicsId::kDCCChannelBoundary))
q = 3;
else
q = 4;
return q;
}
int EcalElectronicsId::channelId() const {
int dcc = dccId();
int dcc_channel = towerId();
int quadrant = EEQuadrant(dcc, dcc_channel);
int strip = stripId();
int xtal = xtalId();
int channel;
if (quadrant == 1 || quadrant == 3)
channel = 5 * (strip - 1) + xtal;
else
channel = 5 * (xtal - 1) + strip;
return channel;
}
/*
int EcalElectronicsId::stripId() {
int dcc = dccId() ;
int dcc_channel = towerId();
int quadrant = EEQuadrant(dcc, dcc_channel);
int xtal = channelId();
int strip;
if (quadrant ==1 || quadrant== 3) strip = (xtal-1)/5 +1;
else strip = (xtal-1) % 5 +1;
return strip;
}
int EcalElectronicsId::XtalInStripId() {
int dcc = dccId() ;
int dcc_channel = towerId();
int quadrant = EEQuadrant(dcc, dcc_channel);
int xtal = channelId();
int id;
if (quadrant ==1 || quadrant== 3) id = (xtal-1)%5 + 1;
else id = (xtal-1)/5 +1;
return id;
}
*/
std::ostream& operator<<(std::ostream& os, const EcalElectronicsId& id) {
return os << id.dccId() << ',' << id.towerId() << ',' << id.stripId() << ',' << id.xtalId();
}
|