File indexing completed on 2024-04-06 12:14:35
0001
0002
0003
0004
0005
0006 #include "Geometry/EcalCommonData/interface/EcalPreshowerNumberingScheme.h"
0007 #include "DataFormats/EcalDetId/interface/ESDetId.h"
0008 #include <sstream>
0009
0010
0011
0012 EcalPreshowerNumberingScheme::EcalPreshowerNumberingScheme() : EcalNumberingScheme() {
0013
0014 int vL2ax[3] = {4, 6, 10};
0015 int vL2ay[3] = {29, 31, 35};
0016
0017 int vL2bx[1] = {2};
0018 int vL2by[1] = {25};
0019
0020 int vL3ax[3] = {30, 34, 36};
0021 int vL3ay[3] = {35, 31, 29};
0022
0023 int vL3bx[1] = {38};
0024 int vL3by[1] = {25};
0025
0026 int vL1ax[26] = {2, 4, 4, 8, 8, 8, 8, 10, 12, 12, 14, 14, 20, 20, 26, 26, 28, 28, 30, 32, 32, 32, 32, 36, 36, 38};
0027 int vL1ay[26] = {21, 25, 21, 33, 29, 25, 21, 21, 25, 21, 31, 27, 32,
0028 28, 31, 27, 25, 21, 21, 33, 29, 25, 21, 25, 21, 21};
0029
0030 int vL1bx[1] = {22};
0031 int vL1by[1] = {27};
0032
0033 int vL1cx[1] = {18};
0034 int vL1cy[1] = {27};
0035
0036 int vL1dx[1] = {26};
0037 int vL1dy[1] = {23};
0038
0039 int vL1ex[1] = {14};
0040 int vL1ey[1] = {23};
0041
0042 int vL0ax[23] = {6, 6, 10, 10, 12, 12, 14, 16, 16, 18, 18, 20, 22, 22, 24, 24, 26, 28, 28, 30, 30, 34, 34};
0043 int vL0ay[23] = {26, 21, 30, 25, 34, 29, 35, 36, 31, 36, 31, 36, 36, 31, 36, 31, 35, 34, 29, 30, 25, 26, 21};
0044
0045 int vL0bx[1] = {24};
0046 int vL0by[1] = {26};
0047
0048 int vL0cx[1] = {16};
0049 int vL0cy[1] = {26};
0050
0051 for (int i = 0; i < 1; ++i) {
0052 L1bx[i] = vL1bx[i];
0053 L1by[i] = vL1by[i];
0054 L1cx[i] = vL1cx[i];
0055 L1cy[i] = vL1cy[i];
0056 L1dx[i] = vL1dx[i];
0057 L1dy[i] = vL1dy[i];
0058 L1ex[i] = vL1ex[i];
0059 L1ey[i] = vL1ey[i];
0060 L0bx[i] = vL0bx[i];
0061 L0by[i] = vL0by[i];
0062 L0cx[i] = vL0cx[i];
0063 L0cy[i] = vL0cy[i];
0064 L3bx[i] = vL3bx[i];
0065 L3by[i] = vL3by[i];
0066 L2bx[i] = vL2bx[i];
0067 L2by[i] = vL2by[i];
0068 }
0069
0070 for (int i = 0; i < 3; ++i) {
0071 L3ax[i] = vL3ax[i];
0072 L3ay[i] = vL3ay[i];
0073 L2ax[i] = vL2ax[i];
0074 L2ay[i] = vL2ay[i];
0075 }
0076
0077 for (int i = 0; i < 23; ++i) {
0078 L0ax[i] = vL0ax[i];
0079 L0ay[i] = vL0ay[i];
0080 }
0081
0082 for (int i = 0; i < 26; ++i) {
0083 L1ax[i] = vL1ax[i];
0084 L1ay[i] = vL1ay[i];
0085 }
0086
0087 edm::LogVerbatim("EcalGeom") << "Creating EcalPreshowerNumberingScheme";
0088 }
0089
0090 EcalPreshowerNumberingScheme::~EcalPreshowerNumberingScheme() {
0091 edm::LogVerbatim("EcalGeom") << "Deleting EcalPreshowerNumberingScheme";
0092 }
0093
0094
0095
0096
0097
0098
0099 uint32_t EcalPreshowerNumberingScheme::getUnitID(const EcalBaseNumber& baseNumber) const {
0100 const int numberOfHierarchyLevels = baseNumber.getLevels();
0101 bool dd4hep = ((numberOfHierarchyLevels == 10) && (baseNumber.getCopyNumber(numberOfHierarchyLevels - 1) == 1) &&
0102 (baseNumber.getLevelName(numberOfHierarchyLevels - 1) != "OCMS"));
0103 #ifdef EDM_ML_DEBUG
0104 std::ostringstream st1;
0105 for (int k = 0; k < numberOfHierarchyLevels; ++k)
0106 st1 << ", " << baseNumber.getLevelName(k) << ":" << baseNumber.getCopyNumber(k);
0107 edm::LogVerbatim("EcalGeom") << "EcalPreshowerNumberingScheme: dd4hep " << dd4hep
0108 << " witg geometry levels = " << numberOfHierarchyLevels << st1.str();
0109 #endif
0110 uint32_t intIndex = 0;
0111 if (numberOfHierarchyLevels > 0) {
0112
0113 int layer = 0;
0114 if (baseNumber.getLevelName(0).find("SFSX") != std::string::npos) {
0115 layer = 1;
0116 } else if (baseNumber.getLevelName(0).find("SFSY") != std::string::npos) {
0117 layer = 2;
0118 } else {
0119 edm::LogWarning("EcalGeom") << "EcalPreshowerNumberingScheme: Wrong name"
0120 << " of Presh. Si. Strip : " << baseNumber.getLevelName(0);
0121 }
0122
0123
0124
0125 int zs = dd4hep ? baseNumber.getCopyNumber(4) : baseNumber.getCopyNumber(5);
0126 int zside = 2 * (1 - zs) + 1;
0127
0128
0129 int box(0), ladd_copy(0);
0130 std::string ladd("");
0131 if (dd4hep) {
0132 auto num1 = numbers(baseNumber.getLevelName(2));
0133 box = num1.second;
0134 ladd_copy = num1.first;
0135 ladd = baseNumber.getLevelName(2).substr(0, 6);
0136 } else {
0137 box = baseNumber.getCopyNumber(2);
0138 ladd_copy = baseNumber.getCopyNumber(3);
0139 ladd = baseNumber.getLevelName(3).substr(0, 6);
0140 }
0141 #ifdef EDM_ML_DEBUG
0142 edm::LogVerbatim("EcalGeom") << "EcalPreshowerNumberingScheme::Box " << box << " Ladder " << ladd << ":"
0143 << ladd_copy;
0144 #endif
0145
0146 int x = 0, y = 0, ix, iy, id;
0147 int mapX[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
0148 int mapY[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
0149
0150 if (ladd == "SFLX0a" || ladd == "SFLY0a") {
0151 mapX[5] = mapX[6] = mapX[7] = mapX[8] = mapX[9] = 1;
0152 mapY[0] = 0;
0153 mapY[1] = 1;
0154 mapY[2] = 2;
0155 mapY[3] = 3;
0156 mapY[4] = 4;
0157 mapY[5] = 0;
0158 mapY[6] = 1;
0159 mapY[7] = 2;
0160 mapY[8] = 3;
0161 mapY[9] = 4;
0162
0163 id = (int)((float)ladd_copy / 2 + 0.5);
0164
0165 x = L0ax[id - 1] + mapX[box - 1000 - 1];
0166 y = L0ay[id - 1] + mapY[box - 1000 - 1];
0167
0168 if ((ladd_copy % 2) == 0) {
0169 if (mapX[box - 1000 - 1] == 0)
0170 x += 1;
0171 else if (mapX[box - 1000 - 1] == 1)
0172 x -= 1;
0173 y = 41 - y;
0174 }
0175 }
0176 if (ladd == "SFLX0b" || ladd == "SFLY0b") {
0177 mapX[4] = mapX[5] = mapX[6] = mapX[7] = mapX[8] = 1;
0178 mapY[0] = 1;
0179 mapY[1] = 2;
0180 mapY[2] = 3;
0181 mapY[3] = 4;
0182 mapY[4] = 0;
0183 mapY[5] = 1;
0184 mapY[6] = 2;
0185 mapY[7] = 3;
0186 mapY[8] = 4;
0187 mapY[9] = 0;
0188
0189 x = L0bx[0] + mapX[box - 2000 - 1];
0190 y = L0by[0] + mapY[box - 2000 - 1];
0191
0192 if (ladd_copy == 1) {
0193 x = 41 - x;
0194 y = 41 - y;
0195 }
0196 }
0197 if (ladd == "SFLX0c" || ladd == "SFLY0c") {
0198 mapX[5] = mapX[6] = mapX[7] = mapX[8] = 1;
0199 mapY[0] = 0;
0200 mapY[1] = 1;
0201 mapY[2] = 2;
0202 mapY[3] = 3;
0203 mapY[4] = 4;
0204 mapY[5] = 1;
0205 mapY[6] = 2;
0206 mapY[7] = 3;
0207 mapY[8] = 4;
0208 mapY[9] = 0;
0209
0210 x = L0cx[0] + mapX[box - 3000 - 1];
0211 y = L0cy[0] + mapY[box - 3000 - 1];
0212
0213 if (ladd_copy == 2) {
0214 x = 41 - x;
0215 y = 41 - y;
0216 }
0217 }
0218 if (ladd == "SFLX1a" || ladd == "SFLY1a") {
0219 mapX[4] = mapX[5] = mapX[6] = mapX[7] = 1;
0220 mapY[0] = 0;
0221 mapY[1] = 1;
0222 mapY[2] = 2;
0223 mapY[3] = 3;
0224 mapY[4] = 0;
0225 mapY[5] = 1;
0226 mapY[6] = 2;
0227 mapY[7] = 3;
0228 mapY[8] = 0;
0229 mapY[9] = 0;
0230
0231 id = (int)((float)ladd_copy / 2 + 0.5);
0232
0233 x = L1ax[id - 1] + mapX[box - 4000 - 1];
0234 y = L1ay[id - 1] + mapY[box - 4000 - 1];
0235
0236 if ((ladd_copy % 2) == 0) {
0237 if (mapX[box - 4000 - 1] == 0)
0238 x += 1;
0239 else if (mapX[box - 4000 - 1] == 1)
0240 x -= 1;
0241 y = 41 - y;
0242 }
0243 }
0244 if (ladd == "SFLX1b" || ladd == "SFLY1b") {
0245 mapX[3] = mapX[4] = mapX[5] = mapX[6] = 1;
0246 mapY[0] = 1;
0247 mapY[1] = 2;
0248 mapY[2] = 3;
0249 mapY[3] = 0;
0250 mapY[4] = 1;
0251 mapY[5] = 2;
0252 mapY[6] = 3;
0253 mapY[7] = 0;
0254 mapY[8] = 0;
0255 mapY[9] = 0;
0256
0257 x = L1bx[0] + mapX[box - 5000 - 1];
0258 y = L1by[0] + mapY[box - 5000 - 1];
0259
0260 if (ladd_copy == 1) {
0261 x = 41 - x;
0262 y = 41 - y;
0263 }
0264 }
0265 if (ladd == "SFLX1c" || ladd == "SFLY1c") {
0266 mapX[4] = mapX[5] = mapX[6] = 1;
0267 mapY[0] = 0;
0268 mapY[1] = 1;
0269 mapY[2] = 2;
0270 mapY[3] = 3;
0271 mapY[4] = 1;
0272 mapY[5] = 2;
0273 mapY[6] = 3;
0274 mapY[7] = 0;
0275 mapY[8] = 0;
0276 mapY[9] = 0;
0277
0278 x = L1cx[0] + mapX[box - 6000 - 1];
0279 y = L1cy[0] + mapY[box - 6000 - 1];
0280
0281 if (ladd_copy == 2) {
0282 x = 41 - x;
0283 y = 41 - y;
0284 }
0285 }
0286 if (ladd == "SFLX1d" || ladd == "SFLY1d") {
0287 mapX[2] = mapX[3] = mapX[4] = mapX[5] = 1;
0288 mapY[0] = 2;
0289 mapY[1] = 3;
0290 mapY[2] = 0;
0291 mapY[3] = 1;
0292 mapY[4] = 2;
0293 mapY[5] = 3;
0294 mapY[6] = 0;
0295 mapY[7] = 0;
0296 mapY[8] = 0;
0297 mapY[9] = 0;
0298
0299 x = L1dx[0] + mapX[box - 7000 - 1];
0300 y = L1dy[0] + mapY[box - 7000 - 1];
0301
0302 if (ladd_copy == 1) {
0303 x = 41 - x;
0304 y = 41 - y;
0305 }
0306 }
0307 if (ladd == "SFLX1e" || ladd == "SFLY1e") {
0308 mapX[4] = mapX[5] = 1;
0309 mapY[0] = 0;
0310 mapY[1] = 1;
0311 mapY[2] = 2;
0312 mapY[3] = 3;
0313 mapY[4] = 2;
0314 mapY[5] = 3;
0315 mapY[6] = 0;
0316 mapY[7] = 0;
0317 mapY[8] = 0;
0318 mapY[9] = 0;
0319
0320 x = L1ex[0] + mapX[box - 8000 - 1];
0321 y = L1ey[0] + mapY[box - 8000 - 1];
0322
0323 if (ladd_copy == 2) {
0324 x = 41 - x;
0325 y = 41 - y;
0326 }
0327 }
0328 if (ladd == "SFLX3a" || ladd == "SFLY3a") {
0329 mapX[4] = mapX[5] = mapX[6] = 1;
0330 mapY[0] = 0;
0331 mapY[1] = 1;
0332 mapY[2] = 2;
0333 mapY[3] = 3;
0334 mapY[4] = 0;
0335 mapY[5] = 1;
0336 mapY[6] = 2;
0337 mapY[7] = 0;
0338 mapY[8] = 0;
0339 mapY[9] = 0;
0340
0341 id = (ladd_copy > 3) ? ladd_copy - 3 : 4 - ladd_copy;
0342
0343 x = L3ax[id - 1] + mapX[box - 9000 - 1];
0344 y = L3ay[id - 1] + mapY[box - 9000 - 1];
0345
0346 if (ladd_copy < 4) {
0347 x = 41 - x;
0348 y = 41 - y;
0349 }
0350 }
0351 if (ladd == "SFLX3b" || ladd == "SFLY3b") {
0352 mapX[4] = mapX[5] = 1;
0353 mapY[0] = 0;
0354 mapY[1] = 1;
0355 mapY[2] = 2;
0356 mapY[3] = 3;
0357 mapY[4] = 0;
0358 mapY[5] = 1;
0359 mapY[6] = 0;
0360 mapY[7] = 0;
0361 mapY[8] = 0;
0362 mapY[9] = 0;
0363
0364 x = L3bx[0] + mapX[box - 11000 - 1];
0365 y = L3by[0] + mapY[box - 11000 - 1];
0366
0367 if (ladd_copy == 1) {
0368 x = 41 - x;
0369 y = 41 - y;
0370 }
0371 }
0372 if (ladd == "SFLX2a" || ladd == "SFLY2a") {
0373 mapX[3] = mapX[4] = mapX[5] = mapX[6] = 1;
0374 mapY[0] = 0;
0375 mapY[1] = 1;
0376 mapY[2] = 2;
0377 mapY[3] = 0;
0378 mapY[4] = 1;
0379 mapY[5] = 2;
0380 mapY[6] = 3;
0381 mapY[7] = 0;
0382 mapY[8] = 0;
0383 mapY[9] = 0;
0384
0385 id = (ladd_copy > 3) ? 7 - ladd_copy : ladd_copy;
0386
0387 x = L2ax[id - 1] + mapX[box - 10000 - 1];
0388 y = L2ay[id - 1] + mapY[box - 10000 - 1];
0389
0390 if (ladd_copy > 3) {
0391 x = 41 - x;
0392 y = 41 - y;
0393 }
0394 }
0395 if (ladd == "SFLX2b" || ladd == "SFLY2b") {
0396 mapX[2] = mapX[3] = mapX[4] = mapX[5] = 1;
0397 mapY[0] = 0;
0398 mapY[1] = 1;
0399 mapY[2] = 0;
0400 mapY[3] = 1;
0401 mapY[4] = 2;
0402 mapY[5] = 3;
0403 mapY[6] = 0;
0404 mapY[7] = 0;
0405 mapY[8] = 0;
0406 mapY[9] = 0;
0407
0408 x = L2bx[0] + mapX[box - 12000 - 1];
0409 y = L2by[0] + mapY[box - 12000 - 1];
0410
0411 if (ladd_copy == 2) {
0412 x = 41 - x;
0413 y = 41 - y;
0414 }
0415 }
0416
0417 if (zside < 0 && layer == 1)
0418 x = 41 - x;
0419
0420 ix = x;
0421 iy = y;
0422
0423 if (layer == 2) {
0424 x = (zside > 0) ? iy : 41 - iy;
0425 y = 41 - ix;
0426 }
0427
0428
0429 int strip = baseNumber.getCopyNumber(0);
0430
0431 if (layer == 1) {
0432 if (zside > 0 && y <= 20)
0433 strip = 33 - strip;
0434 else if (zside < 0 && y > 20)
0435 strip = 33 - strip;
0436 } else if (layer == 2) {
0437 if (zside > 0 && x <= 20)
0438 strip = 33 - strip;
0439 else if (zside < 0 && x > 20)
0440 strip = 33 - strip;
0441 }
0442
0443 intIndex = ESDetId(strip, x, y, layer, zside).rawId();
0444
0445 #ifdef EDM_ML_DEBUG
0446 edm::LogVerbatim("EcalGeom") << "EcalPreshowerNumberingScheme : zside " << zs << ":" << zside << " Ladd " << ladd
0447 << " ladd_copy: " << ladd_copy << " box " << box << " x " << x << " y " << y
0448 << " layer " << layer << " strip " << strip << " UnitID 0x" << std::hex << intIndex
0449 << std::dec;
0450
0451 for (int ich = 0; ich < numberOfHierarchyLevels; ich++)
0452 edm::LogVerbatim("EcalGeom") << "Name = " << baseNumber.getLevelName(ich)
0453 << " copy = " << baseNumber.getCopyNumber(ich);
0454 #endif
0455 }
0456
0457 return intIndex;
0458 }
0459
0460 std::pair<int, int> EcalPreshowerNumberingScheme::numbers(const std::string& name) const {
0461 int num1(-1), num2(-1);
0462 if (name.find('#') != std::string::npos) {
0463 uint32_t ip1 = name.find('#');
0464 if (name.find('!') != std::string::npos) {
0465 uint32_t ip2 = name.find('!');
0466 num1 = ::atoi(name.substr(ip1 + 1, ip2 - ip1 - 1).c_str());
0467 if (name.find('#', ip2) != std::string::npos) {
0468 uint32_t ip3 = name.find('#', ip2);
0469 num2 = ::atoi(name.substr(ip3 + 1, name.size() - ip3 - 1).c_str());
0470 }
0471 }
0472 }
0473 #ifdef EDM_ML_DEBUG
0474 edm::LogVerbatim("EcalGeom") << "EcalPreshowerNumberingScheme::Numbers from " << name << " are " << num1 << " and "
0475 << num2;
0476 #endif
0477 return std::make_pair(num1, num2);
0478 }