![]() |
|
|||
File indexing completed on 2024-04-06 11:58:21
0001 #ifndef CSCIndexerStartup_H 0002 #define CSCIndexerStartup_H 0003 0004 /** \class CSCIndexerStartup 0005 * Concrete CSCIndexer class appropriate for CSC Conditions Data access for CMS 0006 * startup (2008-2013) in which most ME4/2 chambers do not exist and the 48 0007 * ME1/1A strips are ganged into 16 channels. <br> The conditions data are 0008 * stored in an order based on the hadrware channel order so this class has to 0009 * jump through hoops in order to map between that order and a CSCDetID order 0010 * offline. 0011 * 0012 * See documentation in base class CSCIndexerBase for more information. 0013 * 0014 * \warning This class is hard-wired for the CSC system at start-up of CMS in 0015 * 2008. with rings ME11, ME12, ME13, ME21, ME22, ME31, ME32, ME41 totalling 234 0016 * chambers per endcap. But ME42 is appended (to permit simulation studies), so 0017 * the chamber order is <br> +z ME11, ME12, ME13, ME21, ME22, ME31, ME32, ME41, 0018 * <br> -z ME11, ME12, ME13, ME21, ME22, ME31, ME32, ME41, <br> +z ME42, -z ME42 0019 * <br> 0020 * 0021 * CSCIndexerBase::stripChannelIndex returns <br> 0022 * 1-217728 (CSCs 2008), 217729-252288 (ME42) (and ME1a channels are always 0023 * channels 65-80 of 1-80 in ME11) 0024 * 0025 * CSCIndexerBase::chipIndex returns <br> 0026 * 1-13608 (CSCs 2008), 13609-15768 (ME42) 0027 * 0028 * CSCIndexerBase::gasGainIndex returns <br> 0029 * 1-45144 (CSCs 2008), 45145-55944 (ME42) 0030 * 0031 * \warning This uses magic numbers galore!! 0032 * \warning EVERY LABEL COUNTS FROM ONE NOT ZERO. 0033 * 0034 */ 0035 0036 #include <CalibMuon/CSCCalibration/interface/CSCIndexerBase.h> 0037 0038 class CSCIndexerStartup : public CSCIndexerBase { 0039 public: 0040 ~CSCIndexerStartup() override; 0041 0042 std::string name() const override { return "CSCIndexerStartup"; } 0043 0044 /// \name maxIndexMethods 0045 //@{ 0046 LongIndexType maxStripChannelIndex() const override { return 252288; } 0047 IndexType maxChipIndex() const override { return 15768; } 0048 IndexType maxGasGainIndex() const override { return 55944; } 0049 //@} 0050 0051 /// \name nonIndexCountingMethods 0052 //@{ 0053 /** 0054 * How many online rings are there in station 'is'=1, 2, 3, 4 ? 0055 * 0056 * \warning: ME1a + ME1b are considered as single ME1/1 0057 * 'online' rings for the startup 0058 */ 0059 IndexType onlineRingsInStation(IndexType is) const override { 0060 const IndexType nrings[5] = {0, 3, 2, 2, 2}; 0061 return nrings[is]; 0062 } 0063 0064 /** 0065 * Number of strip readout channels per layer in an offline chamber 0066 * with ring 'ir' and station 'is'. 0067 * Works for ME1a (ring 4 of ME1) too. 0068 * 0069 * Assume ME1a has 16 ganged readout channels. 0070 */ 0071 IndexType stripChannelsPerOfflineLayer(IndexType is, IndexType ir) const override { 0072 const IndexType nSC[16] = {64, 80, 64, 16, 80, 80, 0, 0, 80, 80, 0, 0, 80, 80, 0, 0}; 0073 return nSC[(is - 1) * 4 + ir - 1]; 0074 } 0075 0076 /** 0077 * Number of strip readout channels per layer in an online chamber 0078 * with ring 'ir' and station 'is'. 0079 * Works for ME1a (ring 4 of ME1) too. 0080 * 0081 * Assume ME1a has 16 ganged readout channels. Online chamber has 64+16=80 0082 * channels. 0083 */ 0084 IndexType stripChannelsPerOnlineLayer(IndexType is, IndexType ir) const override { 0085 const IndexType nSC[16] = {80, 80, 64, 80, 80, 80, 0, 0, 80, 80, 0, 0, 80, 80, 0, 0}; 0086 return nSC[(is - 1) * 4 + ir - 1]; 0087 } 0088 0089 /** 0090 * Number of Buckeye chips per layer in an online chamber 0091 * in ring 'ir' of station 'is'. 0092 * Works for ME1a (ring 4 of ME1) too. 0093 * 0094 * 'Online' ME11 for the startup is considered as a single chamber with 5 0095 * chips 0096 */ 0097 IndexType chipsPerOnlineLayer(IndexType is, IndexType ir) const override { 0098 const IndexType nCinL[16] = {5, 5, 4, 5, 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0}; 0099 return nCinL[(is - 1) * 4 + ir - 1]; 0100 } 0101 0102 //@} 0103 0104 /// \name stripIndexMethods 0105 //@{ 0106 /** 0107 * Number of strip channel indices for a layer in a chamber 0108 * defined by station number 'is' and ring number 'ir'. 0109 * 0110 * Station label range 1-4, Ring label range 1-4 (4=ME1a) 0111 * 0112 * This depends on the ordering of the channels in the database. 0113 * In startup scenario there are 80 indices allocated per ME1/1 layer with 0114 * 1-64 belonging to ME1b and 65-80 belonging to ME1a. So the ME1/a database 0115 * indices are mapped to extend the ME1/b index ranges, which is how the raw 0116 * hardware channels numbering is implemented. 0117 */ 0118 IndexType stripChannelsPerLayer(IndexType is, IndexType ir) const override { 0119 const IndexType nSCinC[16] = {80, 80, 64, 80, 80, 80, 0, 0, 80, 80, 0, 0, 80, 80, 0, 0}; 0120 return nSCinC[(is - 1) * 4 + ir - 1]; 0121 } 0122 0123 /** 0124 * Linear index for 1st strip channel in ring 'ir' of station 'is' in endcap 0125 * 'ie'. 0126 * 0127 * Endcap label range 1-2, Station label range 1-4, Ring label range 1-4. 0128 * 0129 * WARNING: while ME1a channels are the last 16 of the 80 total in each layer 0130 * of an ME11 chamber, their start index here defaults to the start index of 0131 * ME1a. 0132 */ 0133 LongIndexType stripChannelStart(IndexType ie, IndexType is, IndexType ir) const override { 0134 // These are in the ranges 1-217728 (CSCs 2008) and 217729-252288 (ME42). 0135 // There are 1-108884 channels per endcap (CSCs 2008) and 17280 channels per 0136 // endcap (ME42). Start of -z channels (CSCs 2008) is 108864 + 1 = 108865 0137 // Start of +z (ME42) is 217728 + 1 = 217729 0138 // Start of -z (ME42) is 217728 + 1 + 17280 = 235009 0139 const LongIndexType nStart[32] = {1, 17281, 34561, 1, 48385, 57025, 0, 0, 74305, 82945, 0, 0140 0, 100225, 217729, 0, 0, 108865, 126145, 143425, 108865, 157249, 165889, 0141 0, 0, 183169, 191809, 0, 0, 209089, 235009, 0, 0}; 0142 return nStart[(ie - 1) * 16 + (is - 1) * 4 + ir - 1]; 0143 } 0144 //@} 0145 0146 /// \name chipIndexMethods 0147 //@{ 0148 /** 0149 * Number of Buckeye chips indices per layer in a chamber 0150 * in offline ring 'ir' of station 'is'. 0151 * 0152 * Station label range 1-4, Ring label range 1-4 (4=ME1a) 0153 * 0154 * \warning: the ME1a CFEB is just the last 1 of the 5 total in each layer of 0155 * an ME11 chamber. So, the input of ir=4 is will just return the same 5 total 0156 * chips per whole ME11. 0157 * 0158 * Considers ME42 as standard 5 chip per layer chambers. 0159 */ 0160 IndexType chipsPerLayer(IndexType is, IndexType ir) const override { 0161 const IndexType nCinL[16] = {5, 5, 4, 5, 5, 5, 0, 0, 5, 5, 0, 0, 5, 5, 0, 0}; 0162 return nCinL[(is - 1) * 4 + ir - 1]; 0163 } 0164 0165 /** 0166 * Linear index for 1st Buckeye chip in offline ring 'ir' of station 'is' in 0167 * endcap 'ie'. 0168 * 0169 * Endcap label range 1-2, Station label range 1-4, Ring label range 1-3. 0170 * 0171 * \warning: while ME1a chip is the last 1 of the 5 chips total in each layer 0172 * of an ME11 chamber, here the ME1a input ir=4 defaults to the ME1b start 0173 * index (ir=4 <=> ir=1). 0174 */ 0175 IndexType chipStart(IndexType ie, IndexType is, IndexType ir) const override { 0176 // These are in the ranges 1-13608 (CSCs 2008) and 13609-15768 (ME42). 0177 // There are 1-6804 chips per endcap (CSCs 2008) and 1080 channels per 0178 // endcap (ME42). Start of -z channels (CSCs 2008) is 6804 + 1 = 6805 Start 0179 // of +z (ME42) is 13608 + 1 = 13609 Start of -z (ME42) is 13608 + 1 + 1080 0180 // = 14689 0181 const IndexType nStart[32] = {1, 1081, 2161, 1, 3025, 3565, 0, 0, 4645, 5185, 0, 0, 6265, 13609, 0, 0, 0182 6805, 7885, 8965, 6805, 9829, 10369, 0, 0, 11449, 11989, 0, 0, 13069, 14689, 0, 0}; 0183 return nStart[(ie - 1) * 16 + (is - 1) * 4 + ir - 1]; 0184 } 0185 //@} 0186 0187 /// \name gasGainIndexMethods 0188 //@{ 0189 /** 0190 * Linear index for 1st Gas gain sector in ring 'ir' of station 'is' in endcap 0191 * 'ie'. 0192 * 0193 * Endcap label range 1-2, Station label range 1-4, Ring label range 1-4 0194 * (4=ME1a) 0195 * 0196 * \warning: ME1a chip is the last 1 of the 5 chips total in each layer of an 0197 * ME11 chamber, and an input ir=4 in this case would give the same result as 0198 * ir=1 0199 */ 0200 IndexType sectorStart(IndexType ie, IndexType is, IndexType ir) const override { 0201 // There are 36 chambers * 6 layers * 5 CFEB's * 1 HV segment = 1080 0202 // gas-gain sectors in ME1/1 There are 36*6*5*3 = 3240 gas-gain sectors in 0203 // ME1/2 There are 36*6*4*3 = 2592 gas-gain sectors in ME1/3 There are 0204 // 18*6*5*3 = 1620 gas-gain sectors in ME[2-4]/1 There are 36*6*5*5 = 5400 0205 // gas-gain sectors in ME[2-4]/2 Start of -z channels (CSCs 2008) is 22572 + 0206 // 1 = 22573 Start of +z (ME42) is 45144 + 1 = 45145 Start of -z (ME42) is 0207 // 45144 + 1 + 5400 = 50545 0208 const IndexType nStart[32] = {1, 1081, 4321, 0209 1, // ME+1/1,ME+1/2,ME+1/3,ME+1/4 0210 6913, 8533, 0, 0211 0, // ME+2/1,ME+2/2, 0212 13933, 15553, 0, 0213 0, // ME+3/1,ME+3/2, 0214 20953, 45145, 0, 0215 0, // ME+4/1,ME+4/2,ME+4/3 (note, ME+4/2 index follows ME-4/1...) 0216 22573, 23653, 26893, 0217 22573, // ME-1/1,ME-1/2,ME-1/3, ME-1/4 0218 29485, 31105, 0, 0219 0, // ME-2/1,ME-2/2,ME-2/3 0220 36505, 38125, 0, 0221 0, // ME-3/1,ME-3/2,ME-3/3 0222 43525, 50545, 0, 0223 0}; // ME-4/1,ME-4/2,ME-4/3 (note, ME-4/2 index follows ME+4/2...) 0224 return nStart[(ie - 1) * 16 + (is - 1) * 4 + ir - 1]; 0225 } 0226 //@} 0227 0228 /** 0229 * Decode CSCDetId from various indexes and labels 0230 */ 0231 std::pair<CSCDetId, IndexType> detIdFromStripChannelIndex(LongIndexType ichi) const override; 0232 std::pair<CSCDetId, IndexType> detIdFromChipIndex(IndexType ichi) const override; 0233 GasGainIndexType detIdFromGasGainIndex(IndexType igg) const override; 0234 0235 /** 0236 * Build index used internally in online CSC conditions databases (the 'Igor 0237 * Index') 0238 * 0239 * This is the decimal integer ie*100000 + is*10000 + ir*1000 + ic*10 + il 0240 * <br> (ie=1-2, is=1-4, ir=1-4, ic=1-36, il=1-6) <br> Channels 1-16 in ME1A 0241 * (is=1, ir=4) are reset to channels 65-80 of ME11. 0242 */ 0243 int dbIndex(const CSCDetId &id, int &channel) const override; 0244 }; 0245 0246 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.2.1 LXR engine. The LXR team |
![]() ![]() |