#include <CSCIndexer.h>
Creates a linear index for various sublevels of the endcap muon CSC system.
It supplies a linear index for: 1. Each chamber of the CSC system: range 1-468 (CSC system as installed 2008) 469-540 for ME42
2. Each layer of the CSC system: range 1-2808 (CSCs 2008) 2809-3240 for ME42
3. Each strip channel of the CSC system: range 1-217728 (CSCs 2008) 217729-252288 for ME42
4. Each Buckeye chip (1 for each layer in each CFEB)of the CSC system: range 1-13608 (CSCs 2008) 13609-15768 for ME42
The chamber and layer may be specified by CSCDetId or labels for endcap, station, ring, chamber, layer. The strip channel is a value 1-80 (or 64: ME13 chambers have only 64 channels.) The chip number is a value 1-30 (or 24: ME13 chambers have only 24 chips.)
The main user interface is the set of functions
chamberIndex(.)
layerIndex(.)
stripChannelIndex(.)
chipIndex(.)
But the other functions are public since they may be useful in contexts other than for Conditions Data for which the above functions are intended.
Definition at line 43 of file CSCIndexer.h.
typedef uint16_t CSCIndexer::IndexType |
Definition at line 49 of file CSCIndexer.h.
typedef uint32_t CSCIndexer::LongIndexType |
Definition at line 50 of file CSCIndexer.h.
CSCIndexer::CSCIndexer | ( | ) | [inline] |
Definition at line 52 of file CSCIndexer.h.
{};
CSCIndexer::~CSCIndexer | ( | ) | [inline] |
Definition at line 53 of file CSCIndexer.h.
{};
Linear index to label each CSC in CSC system. Argument is the CSCDetId of some CSCChamber.
Output is 1-468 (CSCs 2008) 469-540 (ME42)
WARNING: Do not input ME1a values (i.e. ring '4'): does not consider ME1a and ME1b to be separate, No sanity checking on input value: if you supply an ME1a CSCDetId then you'll get nonsense.
Definition at line 65 of file CSCIndexer.h.
References Reference_intrackfit_cff::endcap, relativeConstraints::ring, and relativeConstraints::station.
Referenced by CSCBadChambers::isInBadChamber(), CSCChamberTimeCorrections::item(), layerIndex(), CSCChamberTimeCorrectionsValues::prefill(), and cond::PayLoadInspector< DataT >::summary().
{ return chamberIndex( id.endcap(), id.station(), id.ring(), id.chamber() ); }
IndexType CSCIndexer::chamberIndex | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir, | ||
IndexType | ic | ||
) | const [inline] |
Linear index for chamber 'ic' in ring 'ir' of station 'is' in endcap 'ie', in range 1-468 (CSCs 2008) or 469-540 (ME42)
Definition at line 98 of file CSCIndexer.h.
References startChamberIndexInEndcap().
{ return startChamberIndexInEndcap(ie,is,ir) + ic - 1; // -1 so start index _is_ ic=1 }
CSCIndexer::IndexType CSCIndexer::chamberLabelFromChamberIndex | ( | IndexType | ici | ) | const |
Definition at line 86 of file CSCIndexer.cc.
References chamberLabel, and fillChamberLabel().
{ // This is just for cross-checking // Expected range of input range argument is 1-540. // 1-468 for CSCs installed at 2008 start-up. 469-540 for ME42. if ( ici > 468 ) { // ME42 ici -= 234; // now in range 235-306 if ( ici > 270 ) { // -z ici -= 36; // now in range 235-270 } } else { // in range 1-468 if ( ici > 234 ) { // -z ici -= 234; // now in range 1-234 } } if (chamberLabel.empty()) fillChamberLabel(); return chamberLabel[ici]; }
How many chambers are there in ring ir of station is?
Works for ME1a (ring 4 of ME1) too.
Definition at line 126 of file CSCIndexer.h.
Referenced by fillChamberLabel().
{ IndexType nc = 36; // most rings have 36 chambers if (is >1 && ir<2 ) nc = 18; // but 21, 31, 41 have 18 return nc; }
Linear index for Buckeye chip processing strip 'istrip'.
Output is 1-5.
WARNING: Use at your own risk! The supplied CSCDetId must be a strip id 1-80 ME1/1a strips must be 65-80 No trapping on out-of-range values!
Definition at line 265 of file CSCIndexer.h.
{
return (istrip-1)/16+1;
}
IndexType CSCIndexer::chipIndex | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir, | ||
IndexType | ic, | ||
IndexType | il, | ||
IndexType | ichip | ||
) | const [inline] |
Linear index for Buckeye chip 'ichip' in layer 'il' of chamber 'ic' of ring 'ir' in station 'is' of endcap 'ie'.
Output is 1-13608 (CSCs 2008) or 13609-15768 (ME42).
WARNING: Use at your own risk! You must input labels within hardware ranges. No trapping on out-of-range values!
Definition at line 236 of file CSCIndexer.h.
References chipsPerLayer(), and chipStart().
Referenced by CSCConditions::chipCorrection(), chipIndex(), CSCDBChipSpeedCorrection::item(), and CSCChipSpeedCorrectionDBConditions::prefillDBChipSpeedCorrection().
{ //printf("ME%d/%d/%d/%d layer %d chip %d chipindex %d\n",ie,is,ir,ic,il,ichip,chipStart(ie,is,ir)+( (ic-1)*6 + il - 1 )*chipsPerLayer(is,ir) + (ichip-1)); return chipStart(ie,is,ir)+( (ic-1)*6 + il - 1 )*chipsPerLayer(is,ir) + (ichip-1); }
Linear index for Buckeye chip 'ichip' in layer labelled by CSCDetId 'id'.
Output is 1-13608 (CSCs 2008) or 13609-15768 (ME42).
WARNING: Use at your own risk! The supplied CSCDetId must be a layer id. No trapping on out-of-range values!
Definition at line 251 of file CSCIndexer.h.
References chipIndex(), Reference_intrackfit_cff::endcap, relativeConstraints::ring, and relativeConstraints::station.
Number of Buckeye chips per layer in a chamber in ring ir of station is.
Station label range 1-4, Ring label range 1-3.
WARNING: ME1a channels are the last 1 of the 5 total in each layer of an ME11 chamber, and an input ir=4 is invalid and will give nonsense.
Considers ME42 as standard 5 chip per layer chambers.
Definition at line 201 of file CSCIndexer.h.
Referenced by chipIndex().
{ const IndexType nCinL[12] = { 5,5,4, 5,5,0, 5,5,0, 5,5,0 }; return nCinL[(is-1)*3 + ir - 1]; }
Linear index for 1st Buckey chip in ring 'ir' of station 'is' in endcap 'ie'.
Endcap label range 1-2, Station label range 1-4, Ring label range 1-3.
WARNING: ME1a channels are the last 1 of the 5 chips total in each layer of an ME11 chamber, and an input ir=4 is invalid and will give nonsense.
Definition at line 214 of file CSCIndexer.h.
Referenced by chipIndex().
{ // 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[24] = {1, 1081, 2161, 3025, 3565, 0, 4645, 5185, 0, 6265, 13609,0, 6805, 7885, 8965, 9829, 10369,0, 11449, 11989, 0, 13069, 14689 ,0 }; return nStart[(ie-1)*12 + (is-1)*3 + ir - 1]; }
int CSCIndexer::dbIndex | ( | const CSCDetId & | id, |
int & | channel | ||
) |
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.
Definition at line 240 of file CSCIndexer.cc.
Referenced by CSCValidation::doADCTiming(), CSCValidation::doAFEBTiming(), CSCValidation::doCompTiming(), CSCValidation::doGasGain(), CSCPedestals::item(), CSCGains::item(), CSCNoiseMatrix::item(), and CSCcrosstalk::item().
{ 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; }
Definition at line 62 of file CSCIndexer.cc.
References chamberLabel, detIdFromChamberLabel(), fillChamberLabel(), and label.
Referenced by detIdFromLayerIndex(), CSCConditions::fillBadStripWords(), CSCConditions::fillBadWireWords(), CSCChipSpeedCorrectionDBConditions::prefillDBChipSpeedCorrection(), and cond::PayLoadInspector< DataT >::summary().
{ // Expected range of input range argument is 1-540. // 1-468 for CSCs installed at 2008 start-up. 469-540 for ME42. IndexType ie = 1; if ( ici > 468 ) { // ME42 ici -= 234; // now in range 235-306 if ( ici > 270 ) { // -z ie = 2; ici -= 36; // now in range 235-270 } } else { // in range 1-468 if ( ici > 234 ) { // -z ie = 2; ici -= 234; // now in range 1-234 } } if (chamberLabel.empty()) fillChamberLabel(); IndexType label = chamberLabel[ici]; return detIdFromChamberLabel( ie, label ); }
Definition at line 24 of file CSCIndexer.cc.
References CSCDetId, i, relativeConstraints::ring, startChamberIndexInEndcap(), and relativeConstraints::station.
{ // Will not work as is for ME42 // ============================ IndexType ie = 1; if (ici > 234 ) { ie = 2; ici -= 234; } // Now ici is in range 1-234 (assuming valid input in range 1-468) // MEij pairs... const IndexType station[] = {0,1,1,1,2,2,3,3,4}; const IndexType ring[] = {0,1,2,3,1,2,1,2,1}; // MEij preceding a given MEij matching linear index above const IndexType prevs[] = {0,0,1,1,1,2,2,3,3}; const IndexType prevr[] = {0,0,1,2,3,1,2,1,2}; IndexType is = 4; IndexType ir = 1; for ( IndexType i = 2; i<=8; ++i) { IndexType js = station[i]; IndexType jr = ring[i]; // if it's before start of MEjs/jr then it's in the previous MEis/ir if ( ici < startChamberIndexInEndcap(ie,js,jr) ) { is = prevs[i]; ir = prevr[i]; break; } // otherwise it's in ME41 } IndexType ic = ici - startChamberIndexInEndcap(ie,is,ir) + 1; return CSCDetId( ie, is, ir, ic ); }
std::pair< CSCDetId, CSCIndexer::IndexType > CSCIndexer::detIdFromChipIndex | ( | IndexType | ichi | ) | const |
Definition at line 185 of file CSCIndexer.cc.
References 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); }
Decode CSCDetId from various indexes and labels
Definition at line 120 of file CSCIndexer.cc.
References CSCDetId, detIdFromChamberIndex(), Reference_intrackfit_cff::endcap, relativeConstraints::ring, and relativeConstraints::station.
Referenced by detIdFromChipIndex(), and detIdFromStripChannelIndex().
std::pair< CSCDetId, CSCIndexer::IndexType > CSCIndexer::detIdFromStripChannelIndex | ( | LongIndexType | ichi | ) | const |
Definition at line 129 of file CSCIndexer.cc.
References detIdFromLayerIndex(), and nchan.
Referenced by operator<<().
{ 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); }
void CSCIndexer::fillChamberLabel | ( | ) | const [private] |
Definition at line 4 of file CSCIndexer.cc.
References chamberLabel, chambersInRingOfStation(), prof2calltree::count, and ringsInStation().
Referenced by chamberLabelFromChamberIndex(), and detIdFromChamberIndex().
{ // Fill the member vector which permits decoding of the linear chamber index // Logically const since initializes cache only, // Beware that the ME42 indices 235-270 within this vector do NOT correspond to // their 'real' linear indices (which are 469-504 for +z) chamberLabel.resize( 271 ); // one more than #chambers per endcap. Includes ME42. IndexType count = 0; chamberLabel[count] = 0; for ( IndexType is = 1 ; is != 5; ++is ) { IndexType irmax = ringsInStation(is); for ( IndexType ir = 1; ir != irmax+1; ++ir ) { IndexType icmax = chambersInRingOfStation(is, ir); for ( IndexType ic = 1; ic != icmax+1; ++ic ) { chamberLabel[ ++count ] = is*1000 + ir*100 + ic ; } } } }
IndexType CSCIndexer::layerIndex | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir, | ||
IndexType | ic, | ||
IndexType | il | ||
) | const [inline] |
Linear index for layer 'il' of chamber 'ic' in ring 'ir' of station 'is' in endcap 'ie', in range 1-2808 (CSCs 2008) or 2809-3240 (ME42).
Definition at line 106 of file CSCIndexer.h.
References chamberIndex().
{ const IndexType layersInChamber = 6; return (chamberIndex(ie,is,ir,ic) - 1 ) * layersInChamber + il; }
Linear index to label each hardware layer in CSC system. Argument is the CSCDetId of some CSCLayer.
Output is 1-2808 (CSCs 2008) 2809-3240 (ME42)
WARNING: Do not input ME1a values (i.e. ring '4'): does not consider ME1a and ME1b to be separate, No sanity checking on input value: if you supply an ME1a CSCDetId then you'll get nonsense.
Definition at line 79 of file CSCIndexer.h.
References Reference_intrackfit_cff::endcap, relativeConstraints::ring, and relativeConstraints::station.
Referenced by CSCConditions::badStripWord(), CSCConditions::badWireWord(), CSCConditions::fillBadStripWords(), CSCConditions::fillBadWireWords(), and cond::PayLoadInspector< DataT >::summary().
{ return layerIndex(id.endcap(), id.station(), id.ring(), id.chamber(), id.layer()); }
How many rings are there in station is=1, 2, 3, 4 ?
BEWARE! Includes ME42 so claims 2 rings in station 4. There is only 1 at CSC installation 2008.
Definition at line 116 of file CSCIndexer.h.
Referenced by fillChamberLabel().
{ const IndexType nrins[5] = {0,3,2,2,2}; // rings per station return nrins[is]; }
IndexType CSCIndexer::startChamberIndexInEndcap | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir | ||
) | const [inline] |
Starting index for first chamber in ring 'ir' of station 'is' in endcap 'ie', in range 1-468 (CSCs 2008) or 469-540 (ME42).
Definition at line 87 of file CSCIndexer.h.
Referenced by chamberIndex(), and detIdFromChamberIndex_OLD().
{ const IndexType nschin[24] = {1,37,73, 109,127,0, 163,181,0, 217,469,0, 235,271,307, 343,361,0, 397,415,0, 451,505,0 }; return nschin[(ie-1)*12 + (is-1)*3 + ir-1]; }
LongIndexType CSCIndexer::stripChannelIndex | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir, | ||
IndexType | ic, | ||
IndexType | il, | ||
IndexType | istrip | ||
) | const [inline] |
Linear index for strip channel istrip in layer 'il' of chamber 'ic' of ring 'ir' in station 'is' of endcap 'ie'.
Output is 1-217728 (CSCs 2008) or 217729-252288 (ME42).
WARNING: Use at your own risk! You must input labels within hardware ranges. No trapping on out-of-range values!
Definition at line 175 of file CSCIndexer.h.
References stripChannelsPerLayer(), and stripChannelStart().
Referenced by CSCDBCrosstalk::item(), CSCDBPedestals::item(), CSCDBNoiseMatrix::item(), CSCDBGains::item(), and stripChannelIndex().
{ return stripChannelStart(ie,is,ir)+( (ic-1)*6 + il - 1 )*stripChannelsPerLayer(is,ir) + (istrip-1); }
LongIndexType CSCIndexer::stripChannelIndex | ( | const CSCDetId & | id, |
IndexType | istrip | ||
) | const [inline] |
Linear index for strip channel 'istrip' in layer labelled by CSCDetId 'id'.
Output is 1-217728 (CSCs 2008) or 217729-252288 (ME42).
WARNING: Use at your own risk! The supplied CSCDetId must be a layer id. No trapping on out-of-range values!
Definition at line 188 of file CSCIndexer.h.
References Reference_intrackfit_cff::endcap, relativeConstraints::ring, relativeConstraints::station, and stripChannelIndex().
{ return stripChannelIndex(id.endcap(), id.station(), id.ring(), id.chamber(), id.layer(), istrip ); }
Number of strip channels per layer in a chamber in ring ir of station is.
Station label range 1-4, Ring label range 1-3.
WARNING: ME1a channels are the last 16 of the 80 total in each layer of an ME11 chamber, and an input ir=4 is invalid and will give nonsense.
Considers ME42 as standard 80-strip per layer chambers.
Definition at line 141 of file CSCIndexer.h.
Referenced by stripChannelIndex().
{ const IndexType nSCinC[12] = { 80,80,64, 80,80,0, 80,80,0, 80,80,0 }; return nSCinC[(is-1)*3 + ir - 1]; }
LongIndexType CSCIndexer::stripChannelStart | ( | IndexType | ie, |
IndexType | is, | ||
IndexType | ir | ||
) | const [inline] |
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-3.
WARNING: ME1a channels are the last 16 of the 80 total in each layer of an ME11 chamber, and an input ir=4 is invalid and will give nonsense.
Definition at line 154 of file CSCIndexer.h.
Referenced by stripChannelIndex().
{ // 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[24] = { 1,17281,34561, 48385,57025,0, 74305,82945,0, 100225,217729,0, 108865,126145,143425, 157249,165889,0, 183169,191809,0, 209089,235009,0 }; return nStart[(ie-1)*12 + (is-1)*3 + ir - 1]; }
std::vector<IndexType> CSCIndexer::chamberLabel [mutable, private] |
Definition at line 293 of file CSCIndexer.h.
Referenced by chamberLabelFromChamberIndex(), detIdFromChamberIndex(), and fillChamberLabel().