CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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);
232  return theBadChambers->isInBadChamber(index);
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!
250  return float(thePedestals->pedestal(index)) / thePedestals->scale_ped();
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!
258  return float(thePedestals->pedestal_rms(index)) / thePedestals->scale_rms();
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()
268  : float(theCrosstalk->linter(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()
278  : float(theCrosstalk->lslope(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 
316  ct[0] = float(theCrosstalk->lslope(index)) / theCrosstalk->sscale();
317  ct[1] = float(theCrosstalk->linter(index)) / theCrosstalk->iscale();
318  ct[2] = float(theCrosstalk->rslope(index)) / theCrosstalk->sscale();
319  ct[3] = float(theCrosstalk->rinter(index)) / theCrosstalk->iscale();
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!
329  return float(theChipCorrections->value(index)) / theChipCorrections->scale();
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(
339  theChamberTimingCorrections->item(index).cfeb_tmb_skew_delay * 1. / theChamberTimingCorrections->precision() +
340  theChamberTimingCorrections->item(index).cfeb_timing_corr * 1. / theChamberTimingCorrections->precision() +
341  (theChamberTimingCorrections->item(index).cfeb_cable_delay * 25.));
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!
350  return float(theChamberTimingCorrections->item(index).anode_bx_offset * 1. /
351  theChamberTimingCorrections->precision());
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!
404  return float(theGasGainCorrections->value(index));
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 }
edm::ESGetToken< CSCDBNoiseMatrix, CSCDBNoiseMatrixRcd > noiseMatrixToken_
edm::ESHandle< CSCDBGasGainCorrection > theGasGainCorrections
edm::ESGetToken< CSCIndexerBase, CSCIndexerRecord > indexerToken_
edm::ESHandle< CSCDBNoiseMatrix > theNoiseMatrix
edm::ESHandle< CSCBadWires > theBadWires
float pedestalSigma(const CSCDetId &detId, int channel) const
static ped rms in ADC counts
void noiseMatrixElements(const CSCDetId &id, int channel, std::vector< float > &me) const
tuple chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, &quot;NDC&quot;) lumi.SetBorderSize( 0 ) lumi...
edm::ESGetToken< CSCDBGains, CSCDBGainsRcd > gainsToken_
void fillBadChannelWords(const CSCDetId &id)
CSCConditions(const edm::ParameterSet &ps, edm::ConsumesCollector)
edm::ESGetToken< CSCDBCrosstalk, CSCDBCrosstalkRcd > crosstalkToken_
edm::ESHandle< CSCChamberTimeCorrections > theChamberTimingCorrections
bool useTimingCorrections() const
did we request reading timing correction info from db?
const CSCDBNoiseMatrix::Item & noiseMatrix(const CSCDetId &detId, int channel) const
raw noise matrix (unscaled short int elements)
void print() const
edm::ESHandle< CSCBadStrips > theBadStrips
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)
float chamberTimingCorrection(const CSCDetId &detId) const
chamber timing correction in ns given detId of chamber
edm::ESHandle< CSCIndexerBase > indexer_
void crossTalk(const CSCDetId &id, int channel, std::vector< float > &ct) const
edm::ESWatcher< CSCDBGainsRcd > gainsWatcher_
edm::ESGetToken< CSCChamberTimeCorrections, CSCChamberTimeCorrectionsRcd > chamberTimingCorrectionsToken_
float anodeBXoffset(const CSCDetId &detId) const
anode bx offset in bx given detId of chamber
void fillBadWireWord(const CSCDetId &id)
bool useTimingCorrections_
edm::ESGetToken< CSCDBPedestals, CSCDBPedestalsRcd > pedestalsToken_
std::bitset< 112 > badWireWord_
float pedestal(const CSCDetId &detId, int channel) const
static ped in ADC counts
edm::ESHandle< CSCChannelMapperBase > mapper_
bool readBadChannels() const
did we request reading bad channel info from db?
bool useGasGainCorrections_
int rawStripChannel(const CSCDetId &id, int geomChannel) const
edm::ESGetToken< CSCBadWires, CSCBadWiresRcd > badWiresToken_
edm::ESHandle< CSCBadChambers > theBadChambers
int channelFromStrip(const CSCDetId &id, int geomStrip) const
feedthrough for external access
edm::ESHandle< CSCDBGains > theGains
edm::ESGetToken< CSCDBGasGainCorrection, CSCDBGasGainCorrectionRcd > gasGainCorrectionsToken_
edm::ESGetToken< CSCDBChipSpeedCorrection, CSCDBChipSpeedCorrectionRcd > chipCorrectionsToken_
void initializeEvent(const edm::EventSetup &es)
fetch database content via EventSetup
void fillBadStripWord(const CSCDetId &id)
fill bad channel words for offline id
edm::ESGetToken< CSCBadChambers, CSCBadChambersRcd > badChambersToken_
float crosstalkSlope(const CSCDetId &detId, int channel, bool leftRight) const
crosstalk slope for left and right
float crosstalkIntercept(const CSCDetId &detId, int channel, bool leftRight) const
crosstalk intercept for left and right
bool isInBadChamber(const CSCDetId &id) const
Is the gven chamber flagged as bad?
float gain(const CSCDetId &detId, int channel) const
gain per channel
edm::ESHandle< CSCDBChipSpeedCorrection > theChipCorrections
edm::ESHandle< CSCDBCrosstalk > theCrosstalk
bool readBadChambers() const
did we request reading bad chamber info from db?
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
void setIdOfBadChannelWords(const CSCDetId &id)
const CSCDetId & idOfBadChannelWords() const
the offline CSCDetId of current bad channel words
float gasGainCorrection(const CSCDetId &detId, int strip, int wire) const
float averageGain() const
bool useGasGainCorrections() const
did we request reading gas gain correction info from db?
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:157
float theAverageGain
bool isValid() const
Definition: ESHandle.h:44
edm::ESHandle< CSCDBPedestals > thePedestals
std::bitset< 112 > badStripWord_
edm::ESGetToken< CSCChannelMapperBase, CSCChannelMapperRecord > mapperToken_