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
|
#ifndef ECALDETID_EBDETID_H
#define ECALDETID_EBDETID_H
#include <iosfwd>
#include <cmath>
#include <cstdlib>
#include "DataFormats/DetId/interface/DetId.h"
#include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
#include "DataFormats/EcalDetId/interface/EcalTrigTowerDetId.h"
/** \class EBDetId
* Crystal identifier class for the ECAL barrel
*
*
*/
class EBDetId : public DetId {
public:
enum { Subdet = EcalBarrel };
/** Constructor of a null id */
EBDetId() {}
/** Constructor from a raw value */
EBDetId(uint32_t rawid) : DetId(rawid) {}
/** Constructor from crystal ieta and iphi
or from SM# and crystal# */
// fast
EBDetId(int crystal_ieta, int crystal_iphi) : DetId(Ecal, EcalBarrel) {
id_ |= ((crystal_ieta > 0) ? (0x10000 | (crystal_ieta << 9)) : ((-crystal_ieta) << 9)) | (crystal_iphi & 0x1FF);
}
// slow
EBDetId(int index1, int index2, int mode);
/** Constructor from a generic cell id */
EBDetId(const DetId& id) : DetId(id) {}
/** Assignment operator from cell id */
EBDetId& operator=(const DetId& id) {
id_ = id.rawId();
return *this;
}
/// get the subdetector .i.e EcalBarrel (what else?)
// EcalSubdetector subdet() const { return EcalSubdetector(subdetId()); }
static EcalSubdetector subdet() { return EcalBarrel; }
/// get the z-side of the crystal (1/-1)
int zside() const { return (id_ & 0x10000) ? (1) : (-1); }
/// get the absolute value of the crystal ieta
int ietaAbs() const { return (id_ >> 9) & 0x7F; }
/// get the crystal ieta
int ieta() const { return zside() * ietaAbs(); }
/// get the crystal iphi
int iphi() const { return id_ & 0x1FF; }
/// get the HCAL/trigger ieta of this crystal
int tower_ieta() const { return ((ietaAbs() - 1) / 5 + 1) * zside(); }
/// get the HCAL/trigger iphi of this crystal
int tower_iphi() const;
/// get the HCAL/trigger iphi of this crystal
EcalTrigTowerDetId tower() const { return EcalTrigTowerDetId(zside(), EcalBarrel, abs(tower_ieta()), tower_iphi()); }
/// get the ECAL/SM id
int ism() const {
int id = (iphi() - 1) / kCrystalsInPhi + 1;
return positiveZ() ? id : id + 18;
}
/// get the number of module inside the SM (1-4)
int im() const {
int ii = (ietaAbs() - 26);
return ii < 0 ? 1 : (ii / 20 + 2);
}
/// get ECAL/crystal number inside SM
int ic() const;
/// get the crystal ieta in the SM convention (1-85)
int ietaSM() const { return ietaAbs(); }
/// get the crystal iphi (1-20)
int iphiSM() const { return ((ic() - 1) % kCrystalsInPhi) + 1; }
// is z positive?
bool positiveZ() const { return id_ & 0x10000; }
// crystal number in eta-phi grid
int numberByEtaPhi() const { return (MAX_IETA + (positiveZ() ? ietaAbs() - 1 : -ietaAbs())) * MAX_IPHI + iphi() - 1; }
// index numbering crystal by SM
int numberBySM() const;
/// get a compact index for arrays
int hashedIndex() const { return numberByEtaPhi(); }
uint32_t denseIndex() const { return hashedIndex(); }
/** returns a new EBDetId offset by nrStepsEta and nrStepsPhi (can be negative),
* returns EBDetId(0) if invalid */
EBDetId offsetBy(int nrStepsEta, int nrStepsPhi) const;
/** returns a new EBDetId on the other zside of barrel (ie iEta*-1),
* returns EBDetId(0) if invalid (shouldnt happen) */
EBDetId switchZSide() const;
/** following are static member functions of the above two functions
* which take and return a DetId, returns DetId(0) if invalid
*/
static DetId offsetBy(const DetId startId, int nrStepsEta, int nrStepsPhi);
static DetId switchZSide(const DetId startId);
/** return an approximate values of eta (~0.15% precise)
*/
float approxEta() const { return ieta() * crystalUnitToEta; }
static float approxEta(const DetId id);
static bool validDenseIndex(uint32_t din) { return (din < kSizeForDenseIndexing); }
static EBDetId detIdFromDenseIndex(uint32_t di) { return unhashIndex(di); }
/// get a DetId from a compact index for arrays
static EBDetId unhashIndex(int hi) {
const int pseudo_eta = hi / MAX_IPHI - MAX_IETA;
return (validHashIndex(hi) ? EBDetId(pseudo_eta < 0 ? pseudo_eta : pseudo_eta + 1, hi % MAX_IPHI + 1) : EBDetId());
}
static bool validHashIndex(int i) { return !(i < MIN_HASH || i > MAX_HASH); }
/// check if a valid index combination
static bool validDetId(int i, int j) {
return i != 0 && (std::abs(i) <= MAX_IETA) && (j >= MIN_IPHI) && (j <= MAX_IPHI);
}
static bool isNextToBoundary(EBDetId id);
static bool isNextToEtaBoundary(EBDetId id);
static bool isNextToPhiBoundary(EBDetId id);
//return the distance in eta units between two EBDetId
static int distanceEta(const EBDetId& a, const EBDetId& b);
//return the distance in phi units between two EBDetId
static int distancePhi(const EBDetId& a, const EBDetId& b);
/// range constants
static const int MIN_IETA = 1;
static const int MIN_IPHI = 1;
static const int MAX_IETA = 85;
static const int MAX_IPHI = 360;
static const int kChannelsPerCard = 5;
static const int kTowersInPhi = 4; // per SM
static const int kModulesPerSM = 4;
static const int kModuleBoundaries[4];
static const int kCrystalsInPhi = 20; // per SM
static const int kCrystalsInEta = 85; // per SM
static const int kCrystalsPerSM = 1700;
static const int MIN_SM = 1;
static const int MAX_SM = 36;
static const int MIN_C = 1;
static const int MAX_C = kCrystalsPerSM;
static const int MIN_HASH = 0; // always 0 ...
static const int MAX_HASH = 2 * MAX_IPHI * MAX_IETA - 1;
// eta coverage of one crystal (approximate)
static const float crystalUnitToEta;
static constexpr int kSizeForDenseIndexing = MAX_HASH + 1;
// function modes for (int, int) constructor
static const int ETAPHIMODE = 0;
static const int SMCRYSTALMODE = 1;
};
std::ostream& operator<<(std::ostream& s, const EBDetId& id);
#endif
|