CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
CSCCLCTDigi.cc
Go to the documentation of this file.
1 
11 #include <iomanip>
12 #include <iostream>
13 
15 
18  const uint16_t quality,
19  const uint16_t pattern,
20  const uint16_t striptype,
21  const uint16_t bend,
22  const uint16_t strip,
23  const uint16_t cfeb,
24  const uint16_t bx,
25  const uint16_t trknmb,
26  const uint16_t fullbx,
27  const int16_t compCode,
28  const Version version,
29  const bool run3_quart_strip_bit,
30  const bool run3_eighth_strip_bit,
31  const uint16_t run3_pattern,
32  const uint16_t run3_slope)
33  : valid_(valid),
34  quality_(quality),
35  pattern_(pattern),
36  striptype_(striptype),
37  bend_(bend),
38  strip_(strip),
39  cfeb_(cfeb),
40  bx_(bx),
41  trknmb_(trknmb),
42  fullbx_(fullbx),
43  compCode_(compCode),
44  run3_quart_strip_bit_(run3_quart_strip_bit),
45  run3_eighth_strip_bit_(run3_eighth_strip_bit),
46  run3_pattern_(run3_pattern),
47  run3_slope_(run3_slope),
48  version_(version) {
49  hits_.resize(NUM_LAYERS);
50  for (auto& p : hits_) {
51  p.resize(CLCT_PATTERN_WIDTH);
52  }
53 }
54 
57  clear(); // set contents to zero
58 }
59 
62  valid_ = 0;
63  quality_ = 0;
64  pattern_ = 0;
65  striptype_ = 0;
66  bend_ = 0;
67  strip_ = 0;
68  cfeb_ = 0;
69  bx_ = 0;
70  trknmb_ = 0;
71  fullbx_ = 0;
72  // Run-3 variables
73  compCode_ = -1;
74  run3_quart_strip_bit_ = false;
75  run3_eighth_strip_bit_ = false;
76  run3_pattern_ = 0;
77  run3_slope_ = 0;
79  hits_.clear();
80  hits_.resize(NUM_LAYERS);
81  for (auto& p : hits_) {
82  p.resize(CLCT_PATTERN_WIDTH);
83  }
84 }
85 
86 // slope in number of half-strips/layer
88  if (isRun3()) {
89  // 4-bit slope
90  float slope[17] = {
91  0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.375, 1.5, 1.625, 1.75, 2.0, 2.5};
92  return (2 * getBend() - 1) * slope[getSlope()];
93  } else {
94  int slope[11] = {0, 0, -8, 8, -6, 6, -4, 4, -2, 2, 0};
95  return float(slope[getPattern()] / 5.);
96  }
97 }
98 
99 uint16_t CSCCLCTDigi::getKeyStrip(const uint16_t n) const {
100  // 10-bit case for strip data word
101  if (compCode_ != -1 and n == 8) {
102  return getKeyStrip(4) * 2 + getEighthStripBit();
103  }
104  // 9-bit case for strip data word
105  else if (compCode_ != -1 and n == 4) {
106  return getKeyStrip(2) * 2 + getQuartStripBit();
107  }
108  // 8-bit case for strip data word (all other cases)
109  else {
110  return cfeb_ * 32 + getStrip();
111  }
112 }
113 
115 float CSCCLCTDigi::getFractionalStrip(const uint16_t n) const {
116  if (compCode_ != -1 and n == 8) {
117  return 0.125f * (getKeyStrip(n) + 0.5);
118  } else if (compCode_ != -1 and n == 4) {
119  return 0.25f * (getKeyStrip(n) + 0.5);
120  } else {
121  return 0.5f * (getKeyStrip(n) + 0.5);
122  }
123 }
124 
126 
127 bool CSCCLCTDigi::operator>(const CSCCLCTDigi& rhs) const {
128  // Several versions of CLCT sorting criteria were used before 2008.
129  // They are available in CMSSW versions prior to 3_1_0; here we only keep
130  // the latest one, used in TMB-07 firmware (w/o distrips).
131  bool returnValue = false;
132 
133  uint16_t quality1 = getQuality();
134  uint16_t quality2 = rhs.getQuality();
135 
136  // Run-3 case
137  if (version_ == Version::Run3) {
138  // Better-quality CLCTs are preferred.
139  // If two qualities are equal, smaller bending is preferred;
140  // left- and right-bend patterns are considered to be of
141  // the same quality. This corresponds to "pattern" being smaller!!!
142  // If both qualities and pattern id's are the same, lower keystrip
143  // is preferred.
144  if ((quality1 > quality2) || (quality1 == quality2 && getPattern() < rhs.getPattern()) ||
145  (quality1 == quality2 && getPattern() == rhs.getPattern() && getKeyStrip() < rhs.getKeyStrip())) {
146  returnValue = true;
147  }
148  }
149  // Legacy case:
150  else {
151  // The bend-direction bit pid[0] is ignored (left and right bends have
152  // equal quality).
153  uint16_t pattern1 = getPattern() & 14;
154  uint16_t pattern2 = rhs.getPattern() & 14;
155 
156  // Better-quality CLCTs are preferred.
157  // If two qualities are equal, larger pattern id (i.e., straighter pattern)
158  // is preferred; left- and right-bend patterns are considered to be of
159  // the same quality.
160  // If both qualities and pattern id's are the same, lower keystrip
161  // is preferred.
162  if ((quality1 > quality2) || (quality1 == quality2 && pattern1 > pattern2) ||
163  (quality1 == quality2 && pattern1 == pattern2 && getKeyStrip() < rhs.getKeyStrip())) {
164  returnValue = true;
165  }
166  }
167  return returnValue;
168 }
169 
170 bool CSCCLCTDigi::operator==(const CSCCLCTDigi& rhs) const {
171  // Exact equality.
172  bool returnValue = false;
173  if (isValid() == rhs.isValid() && getQuality() == rhs.getQuality() && getPattern() == rhs.getPattern() &&
174  getKeyStrip() == rhs.getKeyStrip() && getStripType() == rhs.getStripType() && getBend() == rhs.getBend() &&
175  getBX() == rhs.getBX() && getCompCode() == rhs.getCompCode()) {
176  returnValue = true;
177  }
178  return returnValue;
179 }
180 
181 bool CSCCLCTDigi::operator!=(const CSCCLCTDigi& rhs) const {
182  // True if == is false.
183  bool returnValue = true;
184  if ((*this) == rhs)
185  returnValue = false;
186  return returnValue;
187 }
188 
190 void CSCCLCTDigi::print() const {
191  if (isValid()) {
192  char stripType = (getStripType() == 0) ? 'D' : 'H';
193  char bend = (getBend() == 0) ? 'L' : 'R';
194 
195  edm::LogVerbatim("CSCDigi") << " CSC CLCT #" << std::setw(1) << getTrknmb() << ": Valid = " << std::setw(1)
196  << isValid() << " Key Strip = " << std::setw(3) << getKeyStrip()
197  << " Strip = " << std::setw(2) << getStrip() << " Quality = " << std::setw(1)
198  << getQuality() << " Pattern = " << std::setw(1) << getPattern()
199  << " Bend = " << std::setw(1) << bend << " Strip type = " << std::setw(1) << stripType
200  << " CFEB ID = " << std::setw(1) << getCFEB() << " BX = " << std::setw(1) << getBX()
201  << " Full BX= " << std::setw(1) << getFullBX() << " Comp Code= " << std::setw(1)
202  << getCompCode();
203  } else {
204  edm::LogVerbatim("CSCDigi") << "Not a valid Cathode LCT.";
205  }
206 }
207 
208 std::ostream& operator<<(std::ostream& o, const CSCCLCTDigi& digi) {
209  if (digi.isRun3())
210  return o << "CSC CLCT #" << digi.getTrknmb() << ": Valid = " << digi.isValid() << " BX = " << digi.getBX()
211  << " Run-2 Pattern = " << digi.getPattern() << " Run-3 Pattern = " << digi.getRun3Pattern()
212  << " Quality = " << digi.getQuality() << " Comp Code " << digi.getCompCode()
213  << " Bend = " << digi.getBend() << "\n"
214  << " Slope = " << digi.getSlope() << " CFEB = " << digi.getCFEB() << " Strip = " << digi.getStrip()
215  << " KeyHalfStrip = " << digi.getKeyStrip() << " KeyQuartStrip = " << digi.getKeyStrip(4)
216  << " KeyEighthStrip = " << digi.getKeyStrip(8);
217  else
218  return o << "CSC CLCT #" << digi.getTrknmb() << ": Valid = " << digi.isValid() << " BX = " << digi.getBX()
219  << " Pattern = " << digi.getPattern() << " Quality = " << digi.getQuality() << " Bend = " << digi.getBend()
220  << " CFEB = " << digi.getCFEB() << " HalfStrip = " << digi.getStrip()
221  << " KeyHalfStrip = " << digi.getKeyStrip();
222 }
CSCCLCTDigi::striptype_
uint16_t striptype_
Definition: CSCCLCTDigi.h:207
CSCCLCTDigi::strip_
uint16_t strip_
Definition: CSCCLCTDigi.h:212
MessageLogger.h
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
dqmiodumpmetadata.n
n
Definition: dqmiodumpmetadata.py:28
Pattern_Info
Pattern_Info
Definition: CSCALCTDigi.cc:14
CSCCLCTDigi::getTrknmb
uint16_t getTrknmb() const
return track number (1,2)
Definition: CSCCLCTDigi.h:132
CSCCLCTDigi::operator!=
bool operator!=(const CSCCLCTDigi &) const
True if the preceding one is false.
Definition: CSCCLCTDigi.cc:181
digitizers_cfi.strip
strip
Definition: digitizers_cfi.py:19
CSCCLCTDigi::getCompCode
int16_t getCompCode() const
Definition: CSCCLCTDigi.h:171
CSCCLCTDigi::run3_slope_
uint16_t run3_slope_
Definition: CSCCLCTDigi.h:231
CSCCLCTDigi::getEighthStripBit
bool getEighthStripBit() const
get single eighth strip bit
Definition: CSCCLCTDigi.h:114
l1GtPatternGenerator_cfi.bx
bx
Definition: l1GtPatternGenerator_cfi.py:18
CSCCLCTDigi::valid_
uint16_t valid_
Definition: CSCCLCTDigi.h:200
CSCCLCTDigi::getKeyStrip
uint16_t getKeyStrip(const uint16_t n=2) const
Definition: CSCCLCTDigi.cc:99
CSCCLCTDigi
Definition: CSCCLCTDigi.h:17
CSCCLCTDigi::run3_eighth_strip_bit_
bool run3_eighth_strip_bit_
Definition: CSCCLCTDigi.h:227
EcalTangentSkim_cfg.o
o
Definition: EcalTangentSkim_cfg.py:42
CLCT_PATTERN_WIDTH
Definition: CSCCLCTDigi.cc:14
CSCCLCTDigi::pattern_
uint16_t pattern_
Definition: CSCCLCTDigi.h:206
quality
const uint32_t *__restrict__ Quality * quality
Definition: CAHitNtupletGeneratorKernelsImpl.h:122
CSCCLCTDigi::run3_pattern_
uint16_t run3_pattern_
Definition: CSCCLCTDigi.h:229
sistrip::valid_
static const uint16_t valid_
Definition: Constants.h:17
CSCCLCTDigi::hits_
ComparatorContainer hits_
Definition: CSCCLCTDigi.h:234
CSCCLCTDigi::getQuality
uint16_t getQuality() const
return quality of a pattern (number of layers hit!)
Definition: CSCCLCTDigi.h:56
CSCCLCTDigi::getQuartStripBit
bool getQuartStripBit() const
get single quart strip bit
Definition: CSCCLCTDigi.h:108
CSCCLCTDigi::getBend
uint16_t getBend() const
Definition: CSCCLCTDigi.h:93
CSCCLCTDigi::isRun3
bool isRun3() const
Distinguish Run-1/2 from Run-3.
Definition: CSCCLCTDigi.h:195
CSCCLCTDigi::bend_
uint16_t bend_
Definition: CSCCLCTDigi.h:210
CSCCLCTDigi::getFractionalStrip
float getFractionalStrip(const uint16_t n=2) const
return the fractional strip (middle of the strip)
Definition: CSCCLCTDigi.cc:115
CSCCLCTDigi::fullbx_
uint16_t fullbx_
Definition: CSCCLCTDigi.h:217
CSCCLCTDigi::setRun3
void setRun3(bool isRun3)
Definition: CSCCLCTDigi.cc:125
CSCCLCTDigi::getFullBX
uint16_t getFullBX() const
return 12-bit full BX.
Definition: CSCCLCTDigi.h:165
CSCCLCTDigi::operator>
bool operator>(const CSCCLCTDigi &) const
Definition: CSCCLCTDigi.cc:127
CSCCLCTDigi::bx_
uint16_t bx_
Definition: CSCCLCTDigi.h:215
CSCCLCTDigi::CSCCLCTDigi
CSCCLCTDigi()
default (calls clear())
Definition: CSCCLCTDigi.cc:56
CSCCLCTDigi::getStrip
uint16_t getStrip() const
return halfstrip that goes from 0 to 31 in a (D)CFEB
Definition: CSCCLCTDigi.h:99
AlCaHLTBitMon_ParallelJobs.p
def p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
CSCCLCTDigi::run3_quart_strip_bit_
bool run3_quart_strip_bit_
Definition: CSCCLCTDigi.h:225
CSCCLCTDigi::cfeb_
uint16_t cfeb_
Definition: CSCCLCTDigi.h:214
CSCCLCTDigi::Version::Run3
CSCCLCTDigi::getStripType
uint16_t getStripType() const
return striptype
Definition: CSCCLCTDigi.h:85
L1TdeCSCTPG_cfi.isRun3
isRun3
Definition: L1TdeCSCTPG_cfi.py:32
CSCCLCTDigi::isValid
bool isValid() const
check CLCT validity (1 - valid CLCT)
Definition: CSCCLCTDigi.h:50
topSingleLeptonDQM_PU_cfi.pattern
pattern
Definition: topSingleLeptonDQM_PU_cfi.py:39
CSCCLCTDigi::getSlope
uint16_t getSlope() const
return the slope
Definition: CSCCLCTDigi.h:74
CSCCLCTDigi::getBX
uint16_t getBX() const
return BX
Definition: CSCCLCTDigi.h:123
CSCCLCTDigi::compCode_
int16_t compCode_
Definition: CSCCLCTDigi.h:223
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
CSCCLCTDigi::clear
void clear()
clear this CLCT
Definition: CSCCLCTDigi.cc:61
CSCCLCTDigi.h
NUM_LAYERS
Definition: CSCCLCTDigi.cc:14
CSCCLCTDigi::quality_
uint16_t quality_
Definition: CSCCLCTDigi.h:201
CSCCLCTDigi::getFractionalSlope
float getFractionalSlope() const
Definition: CSCCLCTDigi.cc:87
CSCCLCTDigi::Version::Legacy
CSCCLCTDigi::getCFEB
uint16_t getCFEB() const
return Key CFEB ID
Definition: CSCCLCTDigi.h:117
CSCCLCTDigi::trknmb_
uint16_t trknmb_
Definition: CSCCLCTDigi.h:216
CSCCLCTDigi::print
void print() const
Print content of digi.
Definition: CSCCLCTDigi.cc:190
CSCCLCTDigi::operator==
bool operator==(const CSCCLCTDigi &) const
True if the two LCTs have exactly the same members (except the number).
Definition: CSCCLCTDigi.cc:170
RunInfoPI::valid
Definition: RunInfoPayloadInspectoHelper.h:16
CSCCLCTDigi::getPattern
uint16_t getPattern() const
return pattern
Definition: CSCCLCTDigi.h:62
slope
static const double slope[3]
Definition: CastorTimeSlew.cc:6
CSCCLCTDigi::version_
Version version_
Definition: CSCCLCTDigi.h:236
Version
Definition: InitMessage.h:39
BeamSplash_cfg.version
version
Definition: BeamSplash_cfg.py:45
operator<<
std::ostream & operator<<(std::ostream &o, const CSCCLCTDigi &digi)
Definition: CSCCLCTDigi.cc:208
CSCCLCTDigi::getRun3Pattern
uint16_t getRun3Pattern() const
return pattern
Definition: CSCCLCTDigi.h:68