CMS 3D CMS Logo

CSCConditions.cc
Go to the documentation of this file.
1 
3 
6 
13 
20 
24 
26  : theGains(),
27  theCrosstalk(),
28  thePedestals(),
29  theNoiseMatrix(),
30  theBadStrips(),
31  theBadWires(),
32  theBadChambers(),
33  theChipCorrections(),
34  theChamberTimingCorrections(),
35  theGasGainCorrections(),
36  indexer_(nullptr),
37  mapper_(nullptr),
38  readBadChannels_(false),
39  readBadChambers_(false),
40  useTimingCorrections_(false),
41  useGasGainCorrections_(false),
42  idOfBadChannelWords_(CSCDetId()),
43  badStripWord_(0),
44  badWireWord_(0),
45  theAverageGain(-1.0) {
46  readBadChannels_ = ps.getParameter<bool>("readBadChannels");
47  readBadChambers_ = ps.getParameter<bool>("readBadChambers");
48  useTimingCorrections_ = ps.getParameter<bool>("CSCUseTimingCorrections");
49  useGasGainCorrections_ = ps.getParameter<bool>("CSCUseGasGainCorrections");
56  if (useTimingCorrections()) {
59  }
60  if (readBadChannels()) {
63  }
64  if (readBadChambers()) {
66  }
67  if (useGasGainCorrections()) {
69  }
70 }
71 
73 
75  // Algorithms
78 
79  // Strip gains
81  // Strip X-talk
83  // Strip pedestals
85  // Strip autocorrelation noise matrix
87 
88  if (useTimingCorrections()) {
89  // Buckeye chip speeds
91  // Cable lengths from chambers to peripheral crate and additional chamber
92  // level timing correction
94  }
95 
96  if (readBadChannels()) {
97  // Bad strip channels
99  // Bad wiregroup channels
101 
102  //@@ if( badStripsWatcher_.check( es ) ) {
103  // fillBadStripWords();
104  //@@ }
105  //@@ if( badWiresWatcher_.check( es ) ) {
106  // fillBadWireWords();
107  //@ }
108  }
109 
110  // Has GainsRcd changed?
111  if (gainsWatcher_.check(es)) { // Yes...
112  theAverageGain = -1.0; // ...reset, so next access will recalculate it
113  }
114 
115  if (readBadChambers()) {
116  // Entire bad chambers
118  }
119 
120  if (useGasGainCorrections()) {
122  }
123 
124  // print();
125 }
126 
128  // input CSCDetId is expected to be an offline value i.e. different for ME1/1A
129  // and ME1/1B
130 
131  // Only update content if necessary
132  if (id != idOfBadChannelWords()) {
133  // store offline CSCDetId for the two bad channel words
135 
136  // reset to all zeroes
137  badStripWord_.reset();
138  badWireWord_.reset();
139 
140  if (readBadChannels()) {
141  // convert to online CSCDetId since that is how conditions data are stored
142  CSCDetId idraw = mapper_->rawCSCDetId(id);
143  fillBadStripWord(idraw);
144  fillBadWireWord(idraw);
145  }
146  }
147 }
148 
150 
152  // Input CSCDetId is expected to be a 'raw' value
153 
154  // Find linear index of chamber for input CSCDetId
155  int inputIndex = indexer_->chamberIndex(id);
156  short inputLayer = id.layer();
157 
158  // Does this chamber occur in bad channel list? If so, unpack its bad channels
159 
160  // chambers is a vector<BadChamber>
161  // channels is a vector<BadChannel>
162  // Each BadChamber contains its index (1-468 or 540 w. ME42), the no. of bad
163  // channels, and the index within vector<BadChannel> where this chamber's bad
164  // channels start.
165 
166  for (size_t i = 0; i < theBadStrips->chambers.size(); ++i) { // loop over bad chambers
167  int indexc = theBadStrips->chambers[i].chamber_index;
168  if (indexc != inputIndex)
169  continue; // next iteration if not a match
170 
171  int start = theBadStrips->chambers[i].pointer;
172  int nbad = theBadStrips->chambers[i].bad_channels;
173 
174  for (int j = start - 1; j < start - 1 + nbad; ++j) { // bad channels in this chamber
175  short lay = theBadStrips->channels[j].layer; // value 1-6
176  if (lay != inputLayer)
177  continue;
178 
179  short chan = theBadStrips->channels[j].channel; // value 1-80 (->112 for unganged ME1/1A)
180  // Flags so far unused (and unset in conditins data)
181  // short f1 = theBadStrips->channels[j].flag1;
182  // short f2 = theBadStrips->channels[j].flag2;
183  // short f3 = theBadStrips->channels[j].flag3;
184  badStripWord_.set(chan - 1, true); // set bit 0-79 (111) in 80 (112)-bit
185  // bitset representing this layer
186  } // j
187  } // i
188 }
189 
191  // Input CSCDetId is expected to be a 'raw' value
192 
193  // Find linear index of chamber for input CSCDetId
194  int inputIndex = indexer_->chamberIndex(id);
195  short inputLayer = id.layer();
196 
197  // unpack what we've read from theBadWires
198 
199  for (size_t i = 0; i < theBadWires->chambers.size(); ++i) { // loop over bad chambers
200  int indexc = theBadWires->chambers[i].chamber_index;
201 
202  if (indexc != inputIndex)
203  continue; // next iteration if not a match
204 
205  int start = theBadWires->chambers[i].pointer;
206  int nbad = theBadWires->chambers[i].bad_channels;
207 
208  for (int j = start - 1; j < start - 1 + nbad; ++j) { // bad channels in this chamber
209  short lay = theBadWires->channels[j].layer; // value 1-6
210  if (lay != inputLayer)
211  continue;
212 
213  short chan = theBadWires->channels[j].channel; // value 1-112
214  // short f1 = theBadWires->channels[j].flag1;
215  // short f2 = theBadWires->channels[j].flag2;
216  // short f3 = theBadWires->channels[j].flag3;
217  badWireWord_.set(chan - 1,
218  true); // set bit 0-111 in 112-bit bitset representing this layer
219  } // j
220  } // i
221 }
222 
224  //@@ We do not consider the possibility of having ME1/1A & ME1/1B
225  // independently 'bad'.
226  //@@ To do that we would need to define separate chamber indexes for ME1/1A &
227  // ME1/1B.
228 
229  if (readBadChambers()) {
230  CSCDetId idraw = mapper_->rawCSCDetId(id);
231  int index = indexer_->chamberIndex(idraw);
233  } else
234  return false;
235 }
236 
237 float CSCConditions::gain(const CSCDetId &id, int geomChannel) const {
239  CSCDetId idraw = mapper_->rawCSCDetId(id);
240  int iraw = mapper_->rawStripChannel(id, geomChannel);
241  int index = indexer_->stripChannelIndex(idraw, iraw) - 1; // NOTE THE MINUS ONE!
242  return float(theGains->gain(index)) / theGains->scale();
243 }
244 
245 float CSCConditions::pedestal(const CSCDetId &id, int geomChannel) const {
247  CSCDetId idraw = mapper_->rawCSCDetId(id);
248  int iraw = mapper_->rawStripChannel(id, geomChannel);
249  int index = indexer_->stripChannelIndex(idraw, iraw) - 1; // NOTE THE MINUS ONE!
251 }
252 
253 float CSCConditions::pedestalSigma(const CSCDetId &id, int geomChannel) const {
255  CSCDetId idraw = mapper_->rawCSCDetId(id);
256  int iraw = mapper_->rawStripChannel(id, geomChannel);
257  int index = indexer_->stripChannelIndex(idraw, iraw) - 1; // NOTE THE MINUS ONE!
259 }
260 
261 float CSCConditions::crosstalkIntercept(const CSCDetId &id, int geomChannel, bool leftRight) const {
263  CSCDetId idraw = mapper_->rawCSCDetId(id);
264  int iraw = mapper_->rawStripChannel(id, geomChannel);
265  int index = indexer_->stripChannelIndex(idraw, iraw) - 1; // NOTE THE MINUS ONE!
266  // resistive fraction is at the peak, where t=0
267  return leftRight ? float(theCrosstalk->rinter(index)) / theCrosstalk->iscale()
269 }
270 
271 float CSCConditions::crosstalkSlope(const CSCDetId &id, int geomChannel, bool leftRight) const {
273  CSCDetId idraw = mapper_->rawCSCDetId(id);
274  int iraw = mapper_->rawStripChannel(id, geomChannel);
275  int index = indexer_->stripChannelIndex(idraw, iraw) - 1; // NOTE THE MINUS ONE!
276  // resistive fraction is at the peak, where t=0
277  return leftRight ? float(theCrosstalk->rslope(index)) / theCrosstalk->sscale()
279 }
280 
281 const CSCDBNoiseMatrix::Item &CSCConditions::noiseMatrix(const CSCDetId &id, int geomChannel) const {
282  //@@ BEWARE - THIS FUNCTION DOES NOT APPLY SCALE FACTOR USED IN PACKING VALUES
283  // IN CONDITIONS DATA
284  //@@ MAY BE AN ERROR? WHO WOULD WANT ACCESS WITHOUT IT?
285 
287  CSCDetId idraw = mapper_->rawCSCDetId(id);
288  int iraw = mapper_->rawStripChannel(id, geomChannel);
289  int index = indexer_->stripChannelIndex(idraw, iraw) - 1; // NOTE THE MINUS ONE!
290  return theNoiseMatrix->item(index);
291 }
292 
293 void CSCConditions::noiseMatrixElements(const CSCDetId &id, int geomChannel, std::vector<float> &me) const {
294  assert(me.size() > 11);
295  const CSCDBNoiseMatrix::Item &item = noiseMatrix(id, geomChannel); // i.e. the function above
296  me[0] = float(item.elem33) / theNoiseMatrix->scale();
297  me[1] = float(item.elem34) / theNoiseMatrix->scale();
298  me[2] = float(item.elem35) / theNoiseMatrix->scale();
299  me[3] = float(item.elem44) / theNoiseMatrix->scale();
300  me[4] = float(item.elem45) / theNoiseMatrix->scale();
301  me[5] = float(item.elem46) / theNoiseMatrix->scale();
302  me[6] = float(item.elem55) / theNoiseMatrix->scale();
303  me[7] = float(item.elem56) / theNoiseMatrix->scale();
304  me[8] = float(item.elem57) / theNoiseMatrix->scale();
305  me[9] = float(item.elem66) / theNoiseMatrix->scale();
306  me[10] = float(item.elem67) / theNoiseMatrix->scale();
307  me[11] = float(item.elem77) / theNoiseMatrix->scale();
308 }
309 
310 void CSCConditions::crossTalk(const CSCDetId &id, int geomChannel, std::vector<float> &ct) const {
312  CSCDetId idraw = mapper_->rawCSCDetId(id);
313  int iraw = mapper_->rawStripChannel(id, geomChannel);
314  int index = indexer_->stripChannelIndex(idraw, iraw) - 1; // NOTE THE MINUS ONE!
315 
320 }
321 
322 float CSCConditions::chipCorrection(const CSCDetId &id, int geomChannel) const {
323  if (useTimingCorrections()) {
325  CSCDetId idraw = mapper_->rawCSCDetId(id);
326  int iraw = mapper_->rawStripChannel(id, geomChannel);
327  int ichip = indexer_->chipIndex(iraw); // converts 1-80 to 1-5 (chip#, CFEB#)
328  int index = indexer_->chipIndex(idraw, ichip) - 1; // NOTE THE MINUS ONE!
330  } else
331  return 0;
332 }
334  if (useTimingCorrections()) {
336  CSCDetId idraw = mapper_->rawCSCDetId(id);
337  int index = indexer_->chamberIndex(idraw) - 1; // NOTE THE MINUS ONE!
338  return float(
342  } else
343  return 0;
344 }
345 float CSCConditions::anodeBXoffset(const CSCDetId &id) const {
346  if (useTimingCorrections()) {
348  CSCDetId idraw = mapper_->rawCSCDetId(id);
349  int index = indexer_->chamberIndex(idraw) - 1; // NOTE THE MINUS ONE!
352  } else
353  return 0;
354 }
355 
361  const float loEdge = 5.0; // consider gains above this
362  const float hiEdge = 10.0; // consider gains below this
363  const float loLimit = 6.0; // lowest acceptable average gain
364  const float hiLimit = 9.0; // highest acceptable average gain
365  const float expectedAverage = 7.5; // default average gain
366 
367  if (theAverageGain > 0.)
368  return theAverageGain; // only recalculate if necessary
369 
370  int n_strip = 0;
371  float gain_tot = 0.;
372 
373  CSCDBGains::GainContainer::const_iterator it;
374  for (it = theGains->gains.begin(); it != theGains->gains.end(); ++it) {
375  float the_gain = float(it->gain_slope) / theGains->scale();
376  if (the_gain > loEdge && the_gain < hiEdge) {
377  gain_tot += the_gain;
378  ++n_strip;
379  }
380  }
381 
382  // Average gain
383  if (n_strip > 0) {
384  theAverageGain = gain_tot / n_strip;
385  }
386 
387  // Average gain has been around 7.5 in real data
388  if (theAverageGain < loLimit || theAverageGain > hiLimit) {
389  // LogTrace("CSC") << "Average CSC strip gain = "
390  // << theAverageGain << " is reset to expected value "
391  // << expectedAverage;
392  theAverageGain = expectedAverage;
393  }
394 
395  return theAverageGain;
396 }
397 //
398 float CSCConditions::gasGainCorrection(const CSCDetId &id, int geomChannel, int iwiregroup) const {
399  if (useGasGainCorrections()) {
401  CSCDetId idraw = mapper_->rawCSCDetId(id);
402  int iraw = mapper_->rawStripChannel(id, geomChannel);
403  int index = indexer_->gasGainIndex(idraw, iraw, iwiregroup) - 1; // NOTE THE MINUS ONE!
405  } else {
406  return 1.;
407  }
408 }
409 
410 int CSCConditions::channelFromStrip(const CSCDetId &id, int geomStrip) const {
411  return mapper_->channelFromStrip(id, geomStrip);
412 }
413 
414 int CSCConditions::rawStripChannel(const CSCDetId &id, int geomChannel) const {
415  return mapper_->rawStripChannel(id, geomChannel);
416 }
417 
419 //@@ HAS NOT BEEN UPDATED THROUGH SEVERAL VERSIONS OF THE CONDITIONS DATA
420 {
421  /*
422  std::cout << "SIZES: GAINS: " << theGains->gains.size()
423  << " PEDESTALS: " << thePedestals->pedestals.size()
424  << " NOISES " << theNoiseMatrix->matrix.size() << std::endl;;
425 
426  std::map< int,std::vector<CSCDBGains::Item> >::const_iterator layerGainsItr
427  = theGains->gains.begin(), lastGain = theGains->gains.end(); for( ;
428  layerGainsItr != lastGain; ++layerGainsItr)
429  {
430  std::cout << "GAIN " << layerGainsItr->first
431  << " STRIPS " << layerGainsItr->second.size() << " "
432  << layerGainsItr->second[0].gain_slope
433  << " " << layerGainsItr->second[0].gain_intercept << std::endl;
434  }
435 
436  std::map< int,std::vector<CSCDBPedestals::Item> >::const_iterator
437  pedestalItr = thePedestals->pedestals.begin(), lastPedestal =
438  thePedestals->pedestals.end(); for( ; pedestalItr != lastPedestal;
439  ++pedestalItr)
440  {
441  std::cout << "PEDS " << pedestalItr->first << " "
442  << " STRIPS " << pedestalItr->second.size() << " ";
443  for(int i = 1; i < 80; ++i)
444  {
445  std::cout << pedestalItr->second[i-1].rms << " " ;
446  }
447  std::cout << std::endl;
448  }
449 
450  std::map< int,std::vector<CSCDBCrosstalk::Item> >::const_iterator
451  crosstalkItr = theCrosstalk->crosstalk.begin(), lastCrosstalk =
452  theCrosstalk->crosstalk.end(); for( ; crosstalkItr != lastCrosstalk;
453  ++crosstalkItr)
454  {
455  std::cout << "XTALKS " << crosstalkItr->first
456  << " STRIPS " << crosstalkItr->second.size() << " "
457  << crosstalkItr->second[5].xtalk_slope_left << " "
458  << crosstalkItr->second[5].xtalk_slope_right << " "
459  << crosstalkItr->second[5].xtalk_intercept_left << " "
460  << crosstalkItr->second[5].xtalk_intercept_right << std::endl;
461  }
462  */
463 }
Definition: start.py:1
edm::ESGetToken< CSCDBNoiseMatrix, CSCDBNoiseMatrixRcd > noiseMatrixToken_
edm::ESHandle< CSCDBGasGainCorrection > theGasGainCorrections
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
IndexType chamberIndex(IndexType ie, IndexType is, IndexType ir, IndexType ic) const
const CSCDetId & idOfBadChannelWords() const
the offline CSCDetId of current bad channel words
short int linter(int index) const
IndexType gasGainIndex(IndexType ie, IndexType is, IndexType ir, IndexType ic, IndexType il, IndexType ihvsegment, IndexType ichip) const
short int gain(int index) const
Definition: CSCDBGains.h:27
edm::ESGetToken< CSCIndexerBase, CSCIndexerRecord > indexerToken_
edm::ESHandle< CSCDBNoiseMatrix > theNoiseMatrix
short int rinter(int index) const
IndexType chipIndex(IndexType ie, IndexType is, IndexType ir, IndexType ic, IndexType il, IndexType ichip) const
edm::ESHandle< CSCBadWires > theBadWires
float pedestal(const CSCDetId &detId, int channel) const
static ped in ADC counts
virtual int channelFromStrip(const CSCDetId &id, int strip) const =0
int channelFromStrip(const CSCDetId &id, int geomStrip) const
feedthrough for external access
edm::ESGetToken< CSCDBGains, CSCDBGainsRcd > gainsToken_
void fillBadChannelWords(const CSCDetId &id)
CSCConditions(const edm::ParameterSet &ps, edm::ConsumesCollector)
BadChamberContainer chambers
Definition: CSCBadStrips.h:35
bool isInBadChamber(const CSCDetId &id) const
Is the gven chamber flagged as bad?
edm::ESGetToken< CSCDBCrosstalk, CSCDBCrosstalkRcd > crosstalkToken_
edm::ESHandle< CSCChamberTimeCorrections > theChamberTimingCorrections
GainContainer gains
Definition: CSCDBGains.h:24
edm::ESHandle< CSCBadStrips > theBadStrips
BadChamberContainer chambers
Definition: CSCBadWires.h:35
edm::ESGetToken< CSCBadStrips, CSCBadStripsRcd > badStripsToken_
float chipCorrection(const CSCDetId &detId, int channel) const
chip speed correction in ns given detId (w/layer) and strip channel
assert(be >=bs)
short int value(int index) const
short int lslope(int index) const
bool readBadChannels() const
did we request reading bad channel info from db?
int scale_ped() const
virtual CSCDetId rawCSCDetId(const CSCDetId &id) const =0
edm::ESHandle< CSCIndexerBase > indexer_
bool useTimingCorrections() const
did we request reading timing correction info from db?
edm::ESWatcher< CSCDBGainsRcd > gainsWatcher_
const ChamberTimeCorrections & item(int index) const
edm::ESGetToken< CSCChamberTimeCorrections, CSCChamberTimeCorrectionsRcd > chamberTimingCorrectionsToken_
void fillBadWireWord(const CSCDetId &id)
bool useTimingCorrections_
edm::ESGetToken< CSCDBPedestals, CSCDBPedestalsRcd > pedestalsToken_
float value(int index) const
std::bitset< 112 > badWireWord_
short int pedestal(int index) const
edm::ESHandle< CSCChannelMapperBase > mapper_
bool useGasGainCorrections_
void noiseMatrixElements(const CSCDetId &id, int channel, std::vector< float > &me) const
float gain(const CSCDetId &detId, int channel) const
gain per channel
void print() const
int sscale() const
bool useGasGainCorrections() const
did we request reading gas gain correction info from db?
edm::ESGetToken< CSCBadWires, CSCBadWiresRcd > badWiresToken_
float averageGain() const
edm::ESHandle< CSCBadChambers > theBadChambers
float anodeBXoffset(const CSCDetId &detId) const
anode bx offset in bx given detId of chamber
edm::ESHandle< CSCDBGains > theGains
short int pedestal_rms(int index) const
int rawStripChannel(const CSCDetId &id, int geomChannel) const
int scale_rms() const
int iscale() const
edm::ESGetToken< CSCDBGasGainCorrection, CSCDBGasGainCorrectionRcd > gasGainCorrectionsToken_
edm::ESGetToken< CSCDBChipSpeedCorrection, CSCDBChipSpeedCorrectionRcd > chipCorrectionsToken_
void initializeEvent(const edm::EventSetup &es)
fetch database content via EventSetup
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
void fillBadStripWord(const CSCDetId &id)
fill bad channel words for offline id
edm::ESGetToken< CSCBadChambers, CSCBadChambersRcd > badChambersToken_
BadChannelContainer channels
Definition: CSCBadWires.h:36
bool isValid() const
Definition: ESHandle.h:44
float chamberTimingCorrection(const CSCDetId &detId) const
chamber timing correction in ns given detId of chamber
float gasGainCorrection(const CSCDetId &detId, int strip, int wire) const
int scale() const
Definition: CSCDBGains.h:28
float crosstalkIntercept(const CSCDetId &detId, int channel, bool leftRight) const
crosstalk intercept for left and right
float crosstalkSlope(const CSCDetId &detId, int channel, bool leftRight) const
crosstalk slope for left and right
edm::ESHandle< CSCDBChipSpeedCorrection > theChipCorrections
virtual int rawStripChannel(const CSCDetId &id, int igeom) const =0
Return raw strip channel number for input geometrical channel number.
edm::ESHandle< CSCDBCrosstalk > theCrosstalk
BadChannelContainer channels
Definition: CSCBadStrips.h:36
bool isInBadChamber(IndexType ichamber) const
Is the chamber with index &#39;ichamber&#39; flagged as bad?
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
float pedestalSigma(const CSCDetId &detId, int channel) const
static ped rms in ADC counts
void setIdOfBadChannelWords(const CSCDetId &id)
bool readBadChambers() const
did we request reading bad chamber info from db?
void crossTalk(const CSCDetId &id, int channel, std::vector< float > &ct) const
float theAverageGain
const CSCDBNoiseMatrix::Item & noiseMatrix(const CSCDetId &detId, int channel) const
raw noise matrix (unscaled short int elements)
edm::ESHandle< CSCDBPedestals > thePedestals
std::bitset< 112 > badStripWord_
LongIndexType stripChannelIndex(IndexType ie, IndexType is, IndexType ir, IndexType ic, IndexType il, IndexType istrip) const
short int rslope(int index) const
const Item & item(int index) const
edm::ESGetToken< CSCChannelMapperBase, CSCChannelMapperRecord > mapperToken_