#include <CSCIndexerStartup.h>
Concrete CSCIndexer class appropriate for CSC Conditions Data access for CMS startup (2008-2013) in which most ME4/2 chambers do not exist and the 48 ME1/1A strips are ganged into 16 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.
CSCIndexerBase::stripChannelIndex returns
1-217728 (CSCs 2008), 217729-252288 (ME42) (and ME1a channels are always channels 65-80 of 1-80 in ME11)
CSCIndexerBase::chipIndex returns
1-13608 (CSCs 2008), 13609-15768 (ME42)
CSCIndexerBase::gasGainIndex returns
1-45144 (CSCs 2008), 45145-55944 (ME42)
Definition at line 35 of file CSCIndexerStartup.h.
CSCIndexerStartup::~CSCIndexerStartup | ( | ) |
Definition at line 4 of file CSCIndexerStartup.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)
Considers ME42 as standard 5 chip per layer chambers.
Implements CSCIndexerBase.
Definition at line 162 of file CSCIndexerStartup.h.
Referenced by detIdFromGasGainIndex().
{ const IndexType nCinL[16] = { 5,5,4,5, 5,5,0,0, 5,5,0,0, 5,5,0,0 }; return nCinL[(is - 1)*4 + ir - 1]; }
IndexType CSCIndexerStartup::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 startup is considered as a single chamber with 5 chips
Implements CSCIndexerBase.
Definition at line 98 of file CSCIndexerStartup.h.
{ const IndexType nCinL[16] = { 5,5,4,5, 5,5,0,0, 5,5,0,0, 5,5,0,0 }; return nCinL[(is - 1)*4 + ir - 1]; }
IndexType CSCIndexerStartup::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-3.
Implements CSCIndexerBase.
Definition at line 176 of file CSCIndexerStartup.h.
{ // These are in the ranges 1-13608 (CSCs 2008) and 13609-15768 (ME42). // There are 1-6804 chips per endcap (CSCs 2008) and 1080 channels per endcap (ME42). // 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 const IndexType nStart[32] = { 1, 1081, 2161, 1, 3025, 3565, 0,0, 4645, 5185, 0,0, 6265, 13609,0,0, 6805, 7885, 8965, 6805, 9829, 10369,0,0, 11449, 11989, 0,0, 13069, 14689,0,0 }; return nStart[(ie - 1)*16 + (is - 1)*4 + ir - 1]; }
int CSCIndexerStartup::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 reset to channels 65-80 of ME11.
Implements CSCIndexerBase.
Definition at line 119 of file CSCIndexerStartup.cc.
{ int ec = id.endcap(); int st = id.station(); int rg = id.ring(); int ch = id.chamber(); int la = id.layer(); // The channels of ME1A are channels 65-80 of ME11 if(st == 1 && rg == 4) { rg = 1; if(channel <= 16) channel += 64; // no trapping for any bizarreness } return ec*100000 + st*10000 + rg*1000 + ch*10 + la; }
std::pair< CSCDetId, CSCIndexerBase::IndexType > CSCIndexerStartup::detIdFromChipIndex | ( | IndexType | ichi | ) | const [virtual] |
CSCDetId + chip within chamber from conditions data chip index.
Implements CSCIndexerBase.
Definition at line 63 of file CSCIndexerStartup.cc.
References CSCIndexerBase::detIdFromLayerIndex().
{ 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 // All chambers but ME13 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 { 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 // ME42 chambers { istart = lastnonme42; layerOffset = lastnonme42layer; } 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. return std::pair<CSCDetId, IndexType>(detIdFromLayerIndex(ili), ichip); }
CSCIndexerBase::GasGainIndexType CSCIndexerStartup::detIdFromGasGainIndex | ( | IndexType | igg | ) | const [virtual] |
CSCDetId + HV segment + chip within chamber from conditions data gas gain index.
Implements CSCIndexerBase.
Definition at line 137 of file CSCIndexerStartup.cc.
References chipsPerLayer(), RingESSource_cfi::rings, CSCIndexerBase::sectorsPerLayer(), and mergeVDriftHistosByStation::stations.
{ const int n_types = 18; const IndexType type_starts[n_types] = {1, 1081, 4321, 6913, 8533, 13933, 15553, 20953, 22573, 23653, 26893, 29485, 31105, 36505, 38125, 43525, 45145, 50545}; //+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 const int endcaps[n_types] = {1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 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}; const int rings[n_types] = {1, 2, 3, 1, 2, 1, 2, 1, 1, 2, 3, 1, 2, 1, 2, 1, 2, 2}; // 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 > CSCIndexerStartup::detIdFromStripChannelIndex | ( | LongIndexType | ichi | ) | const [virtual] |
Decode CSCDetId from various indexes and labels
Implements CSCIndexerBase.
Definition at line 7 of file CSCIndexerStartup.cc.
References CSCIndexerBase::detIdFromLayerIndex(), and nchan.
{ 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 // All chambers but ME13 have 80 channels IndexType nchan = 80; // 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 ( isi <= lastnonme42 ) // Chambers as of 2008 Installation { 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 // ME42 chambers { istart = lastnonme42; layerOffset = lastnonme42layer; } 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. return std::pair<CSCDetId, IndexType>(detIdFromLayerIndex(ili), ichan); }
IndexType CSCIndexerStartup::maxChipIndex | ( | ) | const [inline, virtual] |
IndexType CSCIndexerStartup::maxGasGainIndex | ( | ) | const [inline, virtual] |
LongIndexType CSCIndexerStartup::maxStripChannelIndex | ( | ) | const [inline, virtual] |
std::string CSCIndexerStartup::name | ( | ) | const [inline, virtual] |
Reimplemented from CSCIndexerBase.
Definition at line 41 of file CSCIndexerStartup.h.
{return "CSCIndexerStartup";}
How many online rings are there in station 'is'=1, 2, 3, 4 ?
Implements CSCIndexerBase.
Definition at line 59 of file CSCIndexerStartup.h.
{ const IndexType nrings[5] = { 0, 3, 2, 2, 2 }; return nrings[is]; }
IndexType CSCIndexerStartup::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 201 of file CSCIndexerStartup.h.
{ // There are 36 chambers * 6 layers * 5 CFEB's * 1 HV segment = 1080 gas-gain sectors in ME1/1 // 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 const IndexType nStart[32] = {1 ,1081 , 4321, 1, //ME+1/1,ME+1/2,ME+1/3,ME+1/4 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,ME+4/3 (note, ME+4/2 index follows ME-4/1...) 22573,23653,26893, 22573, //ME-1/1,ME-1/2,ME-1/3, ME-1/4 29485,31105, 0, 0, //ME-2/1,ME-2/2,ME-2/3 36505,38125, 0, 0, //ME-3/1,ME-3/2,ME-3/3 43525,50545, 0, 0};//ME-4/1,ME-4/2,ME-4/3 (note, ME-4/2 index follows ME+4/2...) return nStart[(ie-1)*16 + (is-1)*4 + ir - 1]; }
IndexType CSCIndexerStartup::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 startup scenario there are 80 indices allocated per ME1/1 layer with 1-64 belonging to ME1b and 65-80 belonging to ME1a. So the ME1/a database indices are mapped to extend the ME1/b index ranges, which is how the raw hardware channels numbering is implemented.
Implements CSCIndexerBase.
Definition at line 120 of file CSCIndexerStartup.h.
{ const IndexType nSCinC[16] = { 80,80,64,80, 80,80,0,0, 80,80,0,0, 80,80,0,0 }; return nSCinC[(is - 1)*4 + ir - 1]; }
IndexType CSCIndexerStartup::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'. Works for ME1a (ring 4 of ME1) too.
Assume ME1a has 16 ganged readout channels.
Implements CSCIndexerBase.
Definition at line 72 of file CSCIndexerStartup.h.
{ const IndexType nSC[16] = { 64,80,64,16, 80,80,0,0, 80,80,0,0, 80,80,0,0 }; return nSC[(is-1)*4 + ir - 1]; }
IndexType CSCIndexerStartup::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'. Works for ME1a (ring 4 of ME1) too.
Assume ME1a has 16 ganged readout channels. Online chamber has 64+16=80 channels.
Implements CSCIndexerBase.
Definition at line 85 of file CSCIndexerStartup.h.
{ const IndexType nSC[16] = { 80,80,64,80, 80,80,0,0, 80,80,0,0, 80,80,0,0 }; return nSC[(is-1)*4 + ir - 1]; }
LongIndexType CSCIndexerStartup::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.
WARNING: while ME1a channels are the last 16 of the 80 total in each layer of an ME11 chamber, their start index here defaults to the start index of ME1a.
Implements CSCIndexerBase.
Definition at line 134 of file CSCIndexerStartup.h.
{ // These are in the ranges 1-217728 (CSCs 2008) and 217729-252288 (ME42). // There are 1-108884 channels per endcap (CSCs 2008) and 17280 channels per endcap (ME42). // 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 const LongIndexType nStart[32] = { 1, 17281, 34561, 1, 48385, 57025,0,0, 74305, 82945,0,0, 100225,217729,0,0, 108865,126145,143425,108865, 157249,165889,0,0, 183169,191809,0,0, 209089,235009,0,0 }; return nStart[(ie - 1)*16 + (is - 1)*4 + ir - 1]; }