CMS 3D CMS Logo

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