File indexing completed on 2024-04-06 12:15:04
0001 #include "Geometry/HGCalCommonData/interface/HGCalGeomRotation.h"
0002 #include "FWCore/Utilities/interface/Exception.h"
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004
0005 void HGCalGeomRotation::uvMappingFromSector0(WaferCentring waferCentring,
0006 int& moduleU,
0007 int& moduleV,
0008 unsigned sector) const {
0009 if (sector == 0) {
0010 return;
0011 }
0012
0013 if (sectorType_ == SectorType::Sector60Degrees) {
0014 uvMappingFrom60DegreeSector0(waferCentring, moduleU, moduleV, sector);
0015 } else if (sectorType_ == SectorType::Sector120Degrees) {
0016 uvMappingFrom120DegreeSector0(waferCentring, moduleU, moduleV, sector);
0017 }
0018 }
0019
0020 unsigned HGCalGeomRotation::uvMappingToSector0(WaferCentring waferCentring, int& moduleU, int& moduleV) const {
0021 unsigned sector = 0;
0022
0023 if (sectorType_ == SectorType::Sector60Degrees) {
0024 sector = uvMappingTo60DegreeSector0(waferCentring, moduleU, moduleV);
0025 } else if (sectorType_ == SectorType::Sector120Degrees) {
0026 sector = uvMappingTo120DegreeSector0(waferCentring, moduleU, moduleV);
0027 }
0028
0029 return sector;
0030 }
0031
0032 void HGCalGeomRotation::uvMappingFrom60DegreeSector0(WaferCentring waferCentring,
0033 int& moduleU,
0034 int& moduleV,
0035 unsigned sector) const {
0036 if (waferCentring != WaferCentring::WaferCentred) {
0037 edm::LogError("HGCalGeomRotation")
0038 << "HGCalGeomRotation: 60 degree sector defintion selected, but not WaferCentred centring. This is "
0039 "incompatible, assuming WaferCentred centring";
0040 }
0041
0042 if (sector > 5) {
0043 throw cms::Exception("RotationException") << "HGCalGeomRotation: desired sector must be either 0, 1, 2, 3, 4, or 5";
0044 }
0045 for (unsigned rot = 0; rot < sector; rot++) {
0046 RotateModule60DegreesAnticlockwise(moduleU, moduleV);
0047 }
0048 }
0049
0050 void HGCalGeomRotation::uvMappingFrom120DegreeSector0(WaferCentring waferCentring,
0051 int& moduleU,
0052 int& moduleV,
0053 unsigned sector) const {
0054 int offset;
0055
0056 if (waferCentring == WaferCentring::WaferCentred) {
0057 offset = 0;
0058 } else if (waferCentring == WaferCentring::CornerCentredY) {
0059 offset = -1;
0060 } else if (waferCentring == WaferCentring::CornerCentredMercedes) {
0061 offset = 1;
0062 } else {
0063 throw cms::Exception("RotationException")
0064 << "HGCalGeomRotation: WaferCentring must be one of: WaferCentred, CornerCentredY or CornerCentredMercedes";
0065 }
0066
0067 if (sector > 2) {
0068 edm::LogError("RotationException") << "HGCalGeomRotation: desired sector must be either 0, 1 or 2";
0069 return;
0070 }
0071 for (unsigned rot = 0; rot < sector; rot++) {
0072 RotateModule120DegreesAnticlockwise(moduleU, moduleV, offset);
0073 }
0074 }
0075
0076 unsigned HGCalGeomRotation::uvMappingTo120DegreeSector0(WaferCentring waferCentring, int& moduleU, int& moduleV) const {
0077 unsigned sector = 0;
0078 int offset;
0079
0080 if (waferCentring == WaferCentring::WaferCentred) {
0081 if (moduleU > 0 && moduleV >= 0)
0082 return sector;
0083
0084 offset = 0;
0085 if (moduleU >= moduleV && moduleV < 0)
0086 sector = 2;
0087 else
0088 sector = 1;
0089
0090 } else if (waferCentring == WaferCentring::CornerCentredY) {
0091 if (moduleU >= 0 && moduleV >= 0)
0092 return sector;
0093
0094 offset = -1;
0095 if (moduleU > moduleV && moduleV < 0)
0096 sector = 2;
0097 else
0098 sector = 1;
0099
0100 } else if (waferCentring == WaferCentring::CornerCentredMercedes) {
0101 if (moduleU >= 1 && moduleV >= 1)
0102 return sector;
0103
0104 offset = 1;
0105 if (moduleU >= moduleV && moduleV < 1)
0106 sector = 2;
0107 else
0108 sector = 1;
0109 } else {
0110 throw cms::Exception("RotationException")
0111 << "HGCalGeomRotation: WaferCentring must be one of: WaferCentred, CornerCentredY or CornerCentredMercedes";
0112 }
0113
0114 for (unsigned rot = 0; rot < sector; rot++) {
0115 RotateModule120DegreesClockwise(moduleU, moduleV, offset);
0116 }
0117
0118 return sector;
0119 }
0120
0121 unsigned HGCalGeomRotation::uvMappingTo60DegreeSector0(WaferCentring waferCentring, int& moduleU, int& moduleV) const {
0122 unsigned sector = 0;
0123
0124 if (waferCentring != WaferCentring::WaferCentred) {
0125 edm::LogError("HGCalGeomRotation")
0126 << "HGCalGeomRotation: 60 degree sector defintion selected, but not WaferCentred centring. This is "
0127 "incompatible, assuming WaferCentred centring";
0128 }
0129
0130 if (moduleU > 0 && moduleV >= 0) {
0131 if (moduleV < moduleU) {
0132 return sector;
0133 } else {
0134 sector = 1;
0135 }
0136 } else if (moduleU >= moduleV && moduleV < 0) {
0137 if (moduleU >= 0) {
0138 sector = 5;
0139 } else {
0140 sector = 4;
0141 }
0142 } else {
0143 if (moduleV > 0) {
0144 sector = 2;
0145 } else {
0146 sector = 3;
0147 }
0148 }
0149
0150 for (unsigned rot = 0; rot < sector; rot++) {
0151 RotateModule60DegreesClockwise(moduleU, moduleV);
0152 }
0153
0154 return sector;
0155 }
0156
0157 void HGCalGeomRotation::RotateModule60DegreesAnticlockwise(int& moduleU, int& moduleV) const {
0158 int moduleURotated, moduleVRotated;
0159 moduleURotated = moduleU - moduleV;
0160 moduleVRotated = moduleU;
0161
0162 moduleU = moduleURotated;
0163 moduleV = moduleVRotated;
0164 }
0165
0166 void HGCalGeomRotation::RotateModule60DegreesClockwise(int& moduleU, int& moduleV) const {
0167 int moduleURotated, moduleVRotated;
0168 moduleURotated = moduleV;
0169 moduleVRotated = moduleV - moduleU;
0170
0171 moduleU = moduleURotated;
0172 moduleV = moduleVRotated;
0173 }
0174
0175 void HGCalGeomRotation::RotateModule120DegreesAnticlockwise(int& moduleU, int& moduleV, int offset) const {
0176 int moduleURotated, moduleVRotated;
0177
0178 moduleURotated = -moduleV + offset;
0179 moduleVRotated = moduleU - moduleV + offset;
0180
0181 moduleU = moduleURotated;
0182 moduleV = moduleVRotated;
0183 }
0184
0185 void HGCalGeomRotation::RotateModule120DegreesClockwise(int& moduleU, int& moduleV, int offset) const {
0186 int moduleURotated, moduleVRotated;
0187
0188 moduleURotated = moduleV - moduleU;
0189 moduleVRotated = -moduleU + offset;
0190
0191 moduleU = moduleURotated;
0192 moduleV = moduleVRotated;
0193 }