#include <CSCIndexerPostls1.h>
Concrete CSCIndexer class appropriate for CSC Conditions Data access after CMS long shutdown 1 (2013-2014) in which most ME4/2 rings are complete and the 48 strips in ME1/1A are unganged and so have 48 channels.
The conditions data are stored in an order based on the hadrware channel order so this class has to jump through hoops in order to map between that order and a CSCDetID order offline.
See documentation in base class CSCIndexerBase for more information.
It is further extended for unganged ME1a strip channels by appending +z ME1a, -z ME1a.
CSCIndexerBase::stripChannelIndex returns
1-217728 (CSCs 2008), 217729-252288 (ME42), 252289-273024 (unganged ME1a)
CSCIndexerBase::chipIndex returns
1-13608 (CSCs 2008), 13609-15768 (ME42), 15769-17064 (unganged ME1a).
CSCIndexerBase::gasGainIndex returns
1-45144 (CSCs 2008), 45145-55944 (ME42), 55945-57240 (unganged ME1a)
Definition at line 38 of file CSCIndexerPostls1.h.
CSCIndexerPostls1::~CSCIndexerPostls1 | ( | ) |
Definition at line 4 of file CSCIndexerPostls1.cc.
{}
Number of Buckeye chips indices per layer in a chamber in offline ring 'ir' of station 'is'.
Station label range 1-4, Ring label range 1-4 (4=ME1a)
Works for ME1a input as is=1, ir=4 Considers ME42 as standard 5 chip per layer chambers.
WARNING:
Implements CSCIndexerBase.
Definition at line 170 of file CSCIndexerPostls1.h.
Referenced by detIdFromGasGainIndex().
{ const IndexType nCinL[16] = { 5,5,4,3, 5,5,0,0, 5,5,0,0, 5,5,0,0 }; return nCinL[(is - 1)*4 + ir - 1]; }
IndexType CSCIndexerPostls1::chipsPerOnlineLayer | ( | IndexType | is, |
IndexType | ir | ||
) | const [inline, virtual] |
Number of Buckeye chips per layer in an online chamber in ring 'ir' of station 'is'. Works for ME1a (ring 4 of ME1) too.
'Online' ME11 for the upgrade is considered as split into 1a and 1b chambers with 3 and 4 CFEBs respectively
Implements CSCIndexerBase.
Definition at line 102 of file CSCIndexerPostls1.h.
{ const IndexType nCinL[16] = { 4,5,4,3, 5,5,0,0, 5,5,0,0, 5,5,0,0 }; return nCinL[(is - 1)*4 + ir - 1]; }
IndexType CSCIndexerPostls1::chipStart | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir | ||
) | const [inline, virtual] |
Linear index for 1st Buckeye chip in offline ring 'ir' of station 'is' in endcap 'ie'.
Endcap label range 1-2, Station label range 1-4, Ring label range 1-4 (4=ME1a) Works for ME1a input as is=1, ir=4
Implements CSCIndexerBase.
Definition at line 184 of file CSCIndexerPostls1.h.
{ // These are in the ranges 1-13608 (CSCs 2008) and 13609-15768 (ME42) and 15769-17064 (ME1a). // There are 1-6804 chips per endcap (CSCs 2008) and 1080 chips per endcap (ME42) and 648 chips per endcap (ME1a). // Start of -z channels (CSCs 2008) is 6804 + 1 = 6805 // Start of +z (ME42) is 13608 + 1 = 13609 // Start of -z (ME42) is 13608 + 1 + 1080 = 14689 // Start of +z (ME1a) is 15768 + 1 = 15769 // Start of -z (ME1a) is 15768 + 1 + 648 = 16417 const IndexType nStart[32] = {1, 1081, 2161, 15769, 3025, 3565, 0,0, 4645, 5185, 0,0, 6265, 13609,0,0, 6805,7885, 8965, 16417, 9829, 10369,0,0, 11449,11989,0,0, 13069,14689,0,0 }; return nStart[(ie - 1)*16 + (is - 1)*4 + ir - 1]; }
int CSCIndexerPostls1::dbIndex | ( | const CSCDetId & | id, |
int & | channel | ||
) | const [virtual] |
Build index used internally in online CSC conditions databases (the 'Igor Index')
This is the decimal integer ie*100000 + is*10000 + ir*1000 + ic*10 + il
(ie=1-2, is=1-4, ir=1-4, ic=1-36, il=1-6)
Channels 1-16 in ME1A (is=1, ir=4) are NOT reset to channels 65-80 of ME11. WARNING: This is now ADAPTED for unganged ME1a channels (we expect that the online conditions DB will adopt it too).
Implements CSCIndexerBase.
Definition at line 159 of file CSCIndexerPostls1.cc.
{ int ec = id.endcap(); int st = id.station(); int rg = id.ring(); int ch = id.chamber(); int la = id.layer(); return ec*100000 + st*10000 + rg*1000 + ch*10 + la; }
std::pair< CSCDetId, CSCIndexerBase::IndexType > CSCIndexerPostls1::detIdFromChipIndex | ( | IndexType | ichi | ) | const [virtual] |
CSCDetId + chip within chamber from conditions data chip index.
Implements CSCIndexerBase.
Definition at line 84 of file CSCIndexerPostls1.cc.
References CSCDetId, CSCIndexerBase::detIdFromLayerIndex(), and Reference_intrackfit_cff::endcap.
{ const LongIndexType lastnonme1a = 15768; // chips in chambers with ME42 installed const LongIndexType lastpluszme1a = 16416; // last unganged ME1a +z chip = 15768 + 648 = 16416 const LongIndexType lastnonme42 = 13608; // chips in 2008 installed chambers const LongIndexType lastplusznonme42 = 6804; // = 13608/2 const LongIndexType firstme13 = 2161; // First channel of ME13 const LongIndexType lastme13 = 3024; // Last channel of ME13 const IndexType lastnonme42layer = 2808; const IndexType lastplusznonme42layer = 1404; // = 2808/2 const IndexType firstme13layer = 433; // = 72*6 + 1 (ME13 chambers are 72-108 in range 1-234) const IndexType lastme13layer = 648; // = 108*6 bool me1a = false; // Most chambers (except ME13, ME1a) have 5 chips/layer IndexType nchipPerLayer = 5; // Set endcap to +z. This should work for ME42 channels too, since we don't need to calculate its endcap explicitly. IndexType ie = 1; LongIndexType istart = 0; IndexType layerOffset = 0; if ( ici <= lastnonme42 ) { // Chambers as of 2008 Installation (ME11 keeps the same #of chips 5 allocated for it in the index) if ( ici > lastplusznonme42 ) { ie = 2; ici -= lastplusznonme42; } if ( ici > lastme13 ) // after ME13 { istart = lastme13; layerOffset = lastme13layer; } else if ( ici >= firstme13 ) // ME13 { istart = firstme13 - 1; layerOffset = firstme13layer - 1; nchipPerLayer = 4; } } else if ( ici <= lastnonme1a ) // ME42 chambers { istart = lastnonme42; layerOffset = lastnonme42layer; // don't care about ie, as ME42 stratch of indices is uniform } else // Unganged ME1a channels { me1a = true; if (ici > lastpluszme1a) ie = 2; istart = lastnonme1a; nchipPerLayer = 3; // layerOffset stays 0, as we want to map them onto ME1b's layer indices } ici -= istart; // remove earlier group(s) IndexType ichip = (ici - 1)%nchipPerLayer + 1; IndexType ili = (ici - 1)/nchipPerLayer + 1; ili += layerOffset; // add appropriate offset for earlier group(s) if ( ie != 1 ) ili += lastplusznonme42layer; // add offset to -z endcap; ME42 doesn't need this. CSCDetId id = detIdFromLayerIndex(ili); // For unganged ME1a we need to turn this ME11 detid into an ME1a one if ( me1a ) id = CSCDetId( id.endcap(), 1, 4, id.chamber(), id.layer() ); return std::make_pair(id, ichip); }
CSCIndexerBase::GasGainIndexType CSCIndexerPostls1::detIdFromGasGainIndex | ( | IndexType | igg | ) | const [virtual] |
CSCDetId + HV segment + chip within chamber from conditions data gas gain index.
Implements CSCIndexerBase.
Definition at line 171 of file CSCIndexerPostls1.cc.
References chipsPerLayer(), CSCIndexerBase::sectorsPerLayer(), and mergeVDriftHistosByStation::stations.
{ const int n_types = 20; const IndexType type_starts[n_types] = {1, 1081, 4321, 6913, 8533, 13933, 15553, 20953, 22573, 23653, 26893, 29485, 31105, 36505, 38125, 43525, 45145, 50545, 55945, 56593}; //+1/1 +1/2 +1/3 +2/1 +2/2 +3/1 +3/2 +4/1 -1/1 -1/2 -1/3 -2/1 -2/2 -3/1 -3/2 -4/1 +4/2 -4/2 +1/4 -1/4 const int endcaps[n_types] = {1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2}; const int stations[n_types] = {1, 1, 1, 2, 2, 3, 3, 4, 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 1, 1}; const int rings[n_types] = {1, 2, 3, 1, 2, 1, 2, 1, 1, 2, 3, 1, 2, 1, 2, 1, 2, 2, 4, 4}; // determine chamber type std::vector<IndexType> v_type_starts(type_starts, type_starts + n_types); int type = int(std::upper_bound(v_type_starts.begin(), v_type_starts.end(), igg) - v_type_starts.begin()) - 1; // determine factors for #HVsectors and #chips int sectors_per_layer = sectorsPerLayer(stations[type], rings[type]); int chips_per_layer = chipsPerLayer(stations[type], rings[type]); IndexType igg_chamber_etc = igg - type_starts[type] + 1; IndexType igg_chamber_and_layer = (igg_chamber_etc - 1) / sectors_per_layer + 1; // extract chamber & layer int chamber = (igg_chamber_and_layer - 1) / 6 + 1; int layer = (igg_chamber_and_layer - 1) % 6 + 1; IndexType igg_hvseg_etc = (igg_chamber_etc - 1) % sectors_per_layer + 1; // extract HVsegment and chip numbers IndexType hvsegment = (igg_hvseg_etc - 1) / chips_per_layer + 1; IndexType chip = (igg_hvseg_etc - 1) % chips_per_layer + 1; CSCDetId id(endcaps[type], stations[type], rings[type], chamber, layer); return boost::make_tuple(id, hvsegment, chip); }
std::pair< CSCDetId, CSCIndexerBase::IndexType > CSCIndexerPostls1::detIdFromStripChannelIndex | ( | LongIndexType | ichi | ) | const [virtual] |
Decode CSCDetId from various indexes and labels
Implements CSCIndexerBase.
Definition at line 7 of file CSCIndexerPostls1.cc.
References CSCDetId, CSCIndexerBase::detIdFromLayerIndex(), Reference_intrackfit_cff::endcap, and nchan.
{ const LongIndexType lastnonme1a = 252288; // channels with ME42 installed const LongIndexType lastpluszme1a = 262656; // last unganged ME1a +z channel = 252288 + 10368 const LongIndexType lastnonme42 = 217728; // channels in 2008 installed chambers const LongIndexType lastplusznonme42 = 108864; // = 217728/2 const LongIndexType firstme13 = 34561; // First channel of ME13 const LongIndexType lastme13 = 48384; // Last channel of ME13 const IndexType lastnonme42layer = 2808; const IndexType lastplusznonme42layer = 1404; // = 2808/2 const IndexType firstme13layer = 433; // = 72*6 + 1 (ME13 chambers are 72-108 in range 1-234) const IndexType lastme13layer = 648; // = 108*6 bool me1a = false; // Most chambers (except ME13 & ME1a) have 80 channels index width allocated // unganged ME1a have 48 channels // ME13 have 64 channels IndexType nchan = 80; // Set endcap to +z initially IndexType ie = 1; LongIndexType istart = 0; IndexType layerOffset = 0; if ( isi <= lastnonme42 ) { // Chambers as of 2008 Installation (ME11 keeps the same #of channels 80 allocated for it in the index) if ( isi > lastplusznonme42 ) { ie = 2; isi -= lastplusznonme42; } if ( isi > lastme13 ) // after ME13 { istart = lastme13; layerOffset = lastme13layer; } else if ( isi >= firstme13 ) // ME13 { istart = firstme13 - 1; layerOffset = firstme13layer - 1; nchan = 64; } } else if ( isi <= lastnonme1a ) // ME42 chambers { istart = lastnonme42; layerOffset = lastnonme42layer; // don't care about ie, as ME42 stretch of indices is uniform } else // Unganged ME1a channels { me1a = true; if (isi > lastpluszme1a) ie = 2; istart = lastnonme1a; nchan = 48; // layerOffset stays 0, as we want to map them onto ME1b's layer indices } isi -= istart; // remove earlier group(s) IndexType ichan = (isi - 1)%nchan + 1; IndexType ili = (isi - 1)/nchan + 1; ili += layerOffset; // add appropriate offset for earlier group(s) if ( ie != 1 ) ili += lastplusznonme42layer; // add offset to -z endcap; ME42 doesn't need this. CSCDetId id = detIdFromLayerIndex(ili); // For unganged ME1a we need to turn this ME11 detid into an ME1a one if ( me1a ) id = CSCDetId( id.endcap(), 1, 4, id.chamber(), id.layer() ); return std::make_pair(id, ichan); }
IndexType CSCIndexerPostls1::maxChipIndex | ( | ) | const [inline, virtual] |
IndexType CSCIndexerPostls1::maxGasGainIndex | ( | ) | const [inline, virtual] |
LongIndexType CSCIndexerPostls1::maxStripChannelIndex | ( | ) | const [inline, virtual] |
std::string CSCIndexerPostls1::name | ( | ) | const [inline, virtual] |
Reimplemented from CSCIndexerBase.
Definition at line 44 of file CSCIndexerPostls1.h.
{ return "CSCIndexerPostls1"; }
How many online rings are there in station 'is'=1, 2, 3, 4 ?
Implements CSCIndexerBase.
Definition at line 63 of file CSCIndexerPostls1.h.
{ const IndexType nrings[5] = { 0, 4, 2, 2, 2 }; return nrings[is]; }
IndexType CSCIndexerPostls1::sectorStart | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir | ||
) | const [inline, virtual] |
Linear index for 1st Gas gain sector in ring 'ir' of station 'is' in endcap 'ie'.
Endcap label range 1-2, Station label range 1-4, Ring label range 1-4 (4=ME1a)
Implements CSCIndexerBase.
Definition at line 211 of file CSCIndexerPostls1.h.
{ // There are 36 chambers * 6 layers * 5 CFEB's * 1 HV segment = 1080 gas-gain sectors in ME1/1 (non-upgraded) // There are 36 chambers * 6 layers * 3 CFEB's * 1 HV segment = 648 gas-gain sectors in ME1/1a (upgraded) // There are 36*6*5*3 = 3240 gas-gain sectors in ME1/2 // There are 36*6*4*3 = 2592 gas-gain sectors in ME1/3 // There are 18*6*5*3 = 1620 gas-gain sectors in ME[2-4]/1 // There are 36*6*5*5 = 5400 gas-gain sectors in ME[2-4]/2 // Start of -z channels (CSCs 2008) is 22572 + 1 = 22573 // Start of +z (ME42) is 45144 + 1 = 45145 // Start of -z (ME42) is 45144 + 1 + 5400 = 50545 // Start of +z (ME1a) is 45144 + 1 + 2*5400 = 55945 // Start of -z (ME42) is 45144 + 1 + 2*5400 + 648 = 56593 const IndexType nStart[32] = {1 , 1081 , 4321, 55945, //ME+1/1,ME+1/2,ME+1/3,ME+1/a 6913 , 8533 , 0, 0, //ME+2/1,ME+2/2 13933, 15553, 0, 0, //ME+3/1,ME+3/2 20953, 45145, 0, 0, //ME+4/1,ME+4/2 (note, ME+4/2 index follows ME-4/1...) 22573, 23653, 26893, 56593, //ME-1/1,ME-1/2,ME-1/3,ME+1/a 29485, 31105, 0, 0, //ME-2/1,ME-2/2 36505, 38125, 0, 0, //ME-3/1,ME-3/2 43525, 50545, 0, 0 };//ME-4/1,ME-4/2 (note, ME-4/2 index follows ME+4/2...) return nStart[(ie-1)*16 + (is-1)*4 + ir - 1]; }
IndexType CSCIndexerPostls1::stripChannelsPerLayer | ( | IndexType | is, |
IndexType | ir | ||
) | const [inline, virtual] |
Number of strip channel indices for a layer in a chamber defined by station number 'is' and ring number 'ir'.
Station label range 1-4, Ring label range 1-4 (4=ME1a)
This depends on the ordering of the channels in the database. In the currently implemented upgrade scenario, the ME1b still keeps the 80 indices wide ranges inherited from Startup (with the last 65-80 indices remaining unused), while the ME1/1A unganged channels get their own 48 indices wide ranges.
Implements CSCIndexerBase.
Definition at line 124 of file CSCIndexerPostls1.h.
{ const IndexType nSCinC[16] = { 80,80,64,48, 80,80,0,0, 80,80,0,0, 80,80,0,0 }; return nSCinC[(is - 1)*4 + ir - 1]; }
IndexType CSCIndexerPostls1::stripChannelsPerOfflineLayer | ( | IndexType | is, |
IndexType | ir | ||
) | const [inline, virtual] |
Number of strip readout channels per layer in an offline chamber with ring 'ir' and station 'is'.
Assume ME1a has 48 unganged readout channels.
Implements CSCIndexerBase.
Definition at line 75 of file CSCIndexerPostls1.h.
{ const IndexType nSC[16] = { 64,80,64,48, 80,80,0,0, 80,80,0,0, 80,80,0,0 }; return nSC[(is-1)*4 + ir - 1]; }
IndexType CSCIndexerPostls1::stripChannelsPerOnlineLayer | ( | IndexType | is, |
IndexType | ir | ||
) | const [inline, virtual] |
Number of strip readout channels per layer in an online chamber with ring 'ir' and station 'is'.
Assume ME1a has 48 unganged readout channels. Online chambers ME1a and ME1b are separate.
Implements CSCIndexerBase.
Definition at line 88 of file CSCIndexerPostls1.h.
{ const IndexType nSC[16] = { 64,80,64,48, 80,80,0,0, 80,80,0,0, 80,80,0,0 }; return nSC[(is-1)*4 + ir - 1]; }
LongIndexType CSCIndexerPostls1::stripChannelStart | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir | ||
) | const [inline, virtual] |
Linear index for 1st strip channel in ring 'ir' of station 'is' in endcap 'ie'.
Endcap label range 1-2, Station label range 1-4, Ring label range 1-4 (4=ME1a)
WARNING: ME1a channels are NOT considered the last 16 of the 80 total in each layer of an ME11 chamber!
Implements CSCIndexerBase.
Definition at line 137 of file CSCIndexerPostls1.h.
{ // These are in the ranges 1-217728 (CSCs 2008), 217729-252288 (ME42), and 252289-273024 (unganged ME1a) // There are 1-108884 channels per endcap (CSCs 2008), 17280 channels per endcap (ME42), // and 10368 channels per endcap (unganged ME1a) // Start of -z channels (CSCs 2008) is 108864 + 1 = 108865 // Start of +z (ME42) is 217728 + 1 = 217729 // Start of -z (ME42) is 217728 + 1 + 17280 = 235009 // Start of +z (unganged ME1a) is 252288 + 1 = 252289 // Start of -z (unganged ME1a) is 252288 + 1 + 10368 = 262657 const LongIndexType nStart[32] = { 1, 17281, 34561,252289, 48385, 57025,0,0, 74305, 82945,0,0, 100225,217729,0,0, 108865,126145,143425,262657, 157249,165889,0,0, 183169,191809,0,0, 209089,235009,0,0 }; return nStart[(ie - 1)*16 + (is - 1)*4 + ir - 1]; }