File indexing completed on 2024-04-06 12:15:18
0001 #include "Geometry/MuonNumbering/interface/RPCNumberingScheme.h"
0002 #include "Geometry/MuonNumbering/interface/MuonBaseNumber.h"
0003 #include "Geometry/MuonNumbering/interface/MuonGeometryConstants.h"
0004 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
0005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0006
0007
0008
0009 RPCNumberingScheme::RPCNumberingScheme(const MuonGeometryConstants& muonConstants) { initMe(muonConstants); }
0010
0011 void RPCNumberingScheme::initMe(const MuonGeometryConstants& muonConstants) {
0012 int theLevelPart = muonConstants.getValue("level");
0013 theRegionLevel = muonConstants.getValue("mr_region") / theLevelPart;
0014 theBWheelLevel = muonConstants.getValue("mr_bwheel") / theLevelPart;
0015 theBStationLevel = muonConstants.getValue("mr_bstation") / theLevelPart;
0016 theBPlaneLevel = muonConstants.getValue("mr_bplane") / theLevelPart;
0017 theBChamberLevel = muonConstants.getValue("mr_bchamber") / theLevelPart;
0018 theEPlaneLevel = muonConstants.getValue("mr_eplane") / theLevelPart;
0019 theESectorLevel = muonConstants.getValue("mr_esector") / theLevelPart;
0020 theERollLevel = muonConstants.getValue("mr_eroll") / theLevelPart;
0021 #ifdef EDM_ML_DEBUG
0022 edm::LogVerbatim("MuonGeom") << "RPCNumberingScheme::theRegionLevel " << theRegionLevel << "\ntheBWheelLevel "
0023 << theBWheelLevel << "\ntheBStationLevel " << theBStationLevel << "\ntheBPlaneLevel "
0024 << theBPlaneLevel << "\ntheBChamberLevel " << theBChamberLevel << "\ntheEPlaneLevel "
0025 << theEPlaneLevel << "\ntheESectorLevel " << theESectorLevel << "\ntheERollLevel "
0026 << theERollLevel;
0027 #endif
0028 }
0029
0030 int RPCNumberingScheme::baseNumberToUnitNumber(const MuonBaseNumber& num) const {
0031 #ifdef EDM_ML_DEBUG
0032 edm::LogVerbatim("MuonGeom") << "RPCNumbering " << num.getLevels();
0033 for (int level = 1; level <= num.getLevels(); level++) {
0034 edm::LogVerbatim("MuonGeom") << level << " " << num.getSuperNo(level) << " " << num.getBaseNo(level);
0035 }
0036 #endif
0037
0038 const int barrel = num.getSuperNo(theRegionLevel);
0039 bool barrel_muon = (barrel == 1);
0040 int maxLevel;
0041 if (barrel_muon) {
0042 maxLevel = theBChamberLevel;
0043 } else {
0044 maxLevel = theERollLevel;
0045 }
0046
0047 if (num.getLevels() != maxLevel) {
0048 edm::LogWarning("MuonGeom") << "RPCNumberingScheme::BNToUN: BaseNumber has " << num.getLevels() << " levels, need "
0049 << maxLevel;
0050 return 0;
0051 }
0052
0053 int plane_id = 0;
0054 int sector_id = 0;
0055 int copy_id = 0;
0056 int roll_id = 0;
0057 int eta_id = 0;
0058 int rr12_id = 0;
0059 bool forward = false;
0060
0061 int sector_copy = 0;
0062
0063
0064
0065 for (int level = 1; level <= maxLevel; level++) {
0066
0067 if (level == theRegionLevel) {
0068 if (barrel_muon) {
0069 roll_id = 0;
0070 } else {
0071 copy_id = 1;
0072 }
0073 }
0074 if (barrel_muon) {
0075 if (level == theBWheelLevel) {
0076 const int copyno = num.getBaseNo(level);
0077 eta_id = 4 + copyno;
0078 } else if (level == theBStationLevel) {
0079
0080 const int copyno = num.getBaseNo(level);
0081
0082 sector_id = copyno + 1;
0083 if (sector_id == 13) {
0084 sector_id = 4;
0085 sector_copy = 1;
0086 } else if (sector_id == 14) {
0087 sector_id = 10;
0088 sector_copy = 1;
0089 }
0090
0091 sector_id *= 3;
0092
0093 } else if (level == theBPlaneLevel) {
0094 const int plane_tag = num.getSuperNo(level);
0095
0096 if (plane_tag == 1) {
0097 plane_id = 1;
0098 } else if (plane_tag == 2) {
0099 plane_id = 5;
0100 } else if (plane_tag == 3) {
0101
0102
0103
0104
0105 plane_id = 2;
0106
0107 #ifdef EDM_ML_DEBUG
0108 edm::LogVerbatim("MuonNumbering") << " KONTROLA w RPCNumberingScheme: eta_id: " << eta_id
0109 << ", plane_tag: " << plane_tag << ", plane_id: " << plane_id;
0110 #endif
0111 } else if (plane_tag == 4) {
0112
0113
0114
0115
0116 plane_id = 6;
0117
0118 #ifdef EDM_ML_DEBUG
0119 edm::LogVerbatim("MuonNumbering") << " KONTROLA w RPCNumberingScheme: eta_id: " << eta_id
0120 << ", plane_tag: " << plane_tag << ", plane_id: " << plane_id;
0121 #endif
0122 } else if (plane_tag == 5) {
0123 plane_id = 3;
0124 } else {
0125 plane_id = 4;
0126 }
0127
0128 } else if (level == theBChamberLevel) {
0129 const int copyno = num.getBaseNo(level);
0130 if ((plane_id == 4) && (sector_id == 4 * 3)) {
0131 copy_id = sector_copy * 2 + copyno + 1;
0132 } else if ((plane_id == 4) && (sector_id == 10 * 3)) {
0133 copy_id = sector_copy + 1;
0134 } else {
0135 copy_id = copyno + 1;
0136 }
0137 const int rollno = num.getSuperNo(level);
0138 roll_id = rollno;
0139 }
0140
0141 } else {
0142 if (level == theRegionLevel) {
0143 const int copyno = num.getBaseNo(level);
0144 forward = (copyno == 0);
0145 } else if (level == theEPlaneLevel) {
0146 const int plane_tag = num.getSuperNo(level);
0147 const int rr12_tag = num.getBaseNo(level);
0148 plane_id = plane_tag;
0149 rr12_id = rr12_tag;
0150 } else if (level == theESectorLevel) {
0151 const int copyno = num.getBaseNo(level);
0152 sector_id = copyno + 1;
0153 if (rr12_id == 1) {
0154 sector_id = sector_id * 2 - 1;
0155 } else if (rr12_id == 2) {
0156 sector_id = sector_id * 2;
0157 }
0158 } else if (level == theERollLevel) {
0159 const int copyno = num.getBaseNo(level);
0160 const int eta_tag = num.getSuperNo(level);
0161
0162 if ((eta_tag == 1) || (eta_tag == 4) || (eta_tag == 7) || (eta_tag == 8)) {
0163 eta_id = 1;
0164 } else if ((eta_tag == 2) || (eta_tag == 5)) {
0165 eta_id = 2;
0166 } else if ((eta_tag == 3) || (eta_tag == 6)) {
0167 eta_id = 3;
0168 }
0169
0170 if (forward)
0171 eta_id = 12 - eta_id;
0172
0173
0174
0175 if ((eta_tag == 4) || (eta_tag == 7) || (eta_tag == 8)) {
0176 sector_id *= 2;
0177 }
0178
0179 roll_id = copyno + 1;
0180 }
0181 }
0182 }
0183
0184
0185
0186 int trIndex = (eta_id * 10000 + plane_id * 1000 + sector_id * 10 + copy_id) * 10 + roll_id;
0187
0188 #ifdef EDM_ML_DEBUG
0189 if (barrel_muon) {
0190 edm::LogVerbatim("MuonGeom") << "RPCNumberingScheme (barrel): ";
0191 } else {
0192 if (forward) {
0193 edm::LogVerbatim("MuonGeom") << "RPCNumberingScheme (forward): ";
0194 } else {
0195 edm::LogVerbatim("MuonGeom") << "RPCNumberingScheme (backward): ";
0196 }
0197 }
0198 edm::LogVerbatim("MuonGeom") << " roll " << roll_id << " copy " << copy_id << " sector " << sector_id << " plane "
0199 << plane_id << " eta " << eta_id << " rr12 " << rr12_id;
0200 #endif
0201
0202
0203 RPCDetId id;
0204 id.buildfromTrIndex(trIndex);
0205
0206 #ifdef EDM_ML_DEBUG
0207 edm::LogVerbatim("MuonGeom") << "RPCNumberingScheme:: DetId " << id;
0208 #endif
0209
0210 return id.rawId();
0211 }