CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripLatency.cc
Go to the documentation of this file.
4 
5 #include <algorithm>
6 #include <iterator>
7 #include <iostream>
8 #include <sstream>
9 
10 bool SiStripLatency::put( const uint32_t detId, const uint16_t apv, const uint16_t latency, const uint16_t mode )
11 {
12  if( detId > 536870911 ) {
13  std::stringstream error;
14  error << "ERROR: the detId = " << detId << " is bigger than the maximum acceptable value = 2^(29) - 1 = " << 536870911 << std::endl;
15  error << "Since we are using 29 bits for the detId and 3 bits for the apv value. The maximum tracker detId at the moment" << std::endl;
16  error << "of the writing of this class was 47017836 as defined in CalibTracker/SiStripCommon/data/SiStripDetInfo.dat." << std::endl;
17  error << "If the maximum value has changed a revision of this calss is needed, possibly changing the detIdAndApv value from" << std::endl;
18  error << "from uint32_t to uint64_t." << std::endl;
19  edm::LogError("SiStripLatency::put") << error;
20  throw cms::Exception("InsertFailure");
21  }
22 
23  // Store all the values in the vectors
24  uint32_t detIdAndApv = (detId << 3) | apv;
25  latIt pos = lower_bound(latencies_.begin(), latencies_.end(), detIdAndApv, OrderByDetIdAndApv());
26 
27  if( pos != latencies_.end() && pos->detIdAndApv == detIdAndApv ) {
28  std::cout << "Value already inserted, skipping insertion" << std::endl;
29  return false;
30  }
31  // std::cout << "Filling with: latency = " << latency << ", mode = " << mode << std::endl;
32  latencies_.insert(pos, Latency(detIdAndApv, latency, mode));
33 
34  return true;
35 }
36 
38 {
39  latIt lat = latencies_.begin();
40  while( lat != latencies_.end() ) {
41  // If it is not the last and it has the same latency and mode as the next one remove it
42  if( ((lat+1) != latencies_.end()) && ((lat+1)->mode == lat->mode) && ((lat+1)->latency == lat->latency) ) {
43  lat = latencies_.erase(lat);
44  }
45  else {
46  ++lat;
47  }
48  }
49 }
50 
51 uint16_t SiStripLatency::latency(const uint32_t detId, const uint16_t apv) const
52 {
53  const latConstIt & pos = position(detId, apv);
54  if( pos == latencies_.end() ) {
55  return 255;
56  }
57  return pos->latency;
58 }
59 
60 uint16_t SiStripLatency::mode(const uint32_t detId, const uint16_t apv) const
61 {
62  const latConstIt & pos = position(detId, apv);
63  if( pos == latencies_.end() ) {
64  return 0;
65  }
66  return pos->mode;
67 }
68 
69 std::pair<uint16_t, uint16_t> SiStripLatency::latencyAndMode(const uint32_t detId, const uint16_t apv) const
70 {
71  const latConstIt & pos = position(detId, apv);
72  if( pos == latencies_.end() ) {
73  return std::make_pair(255, 0);
74  }
75  return std::make_pair(pos->latency, pos->mode);
76 }
77 
79 {
80  if( latencies_.size() == 1 ) {
81  return latencies_[0].latency;
82  }
83  int differentLatenciesNum = 0;
84  // Count the number of different latencies
85  for( latConstIt it = latencies_.begin(); it != latencies_.end()-1; ++it ) {
86  if( it->latency != (it+1)->latency ) {
87  ++differentLatenciesNum;
88  }
89  }
90  if( differentLatenciesNum == 0 ) {
91  return latencies_[0].latency;
92  }
93  return 255;
94 }
95 
97 {
98  if( latencies_.size() == 1 ) {
99  return latencies_[0].mode;
100  }
101  int differentModesNum = 0;
102  // Count the number of different modes
103  for( latConstIt it = latencies_.begin(); it != latencies_.end()-1; ++it ) {
104  if( it->mode != (it+1)->mode ) {
105  ++differentModesNum;
106  }
107  }
108  if( differentModesNum == 0 ) {
109  return latencies_[0].mode;
110  }
111  return 0;
112 }
113 
114 void SiStripLatency::allModes(std::vector<uint16_t> & allModesVector) const
115 {
116  for( latConstIt it = latencies_.begin(); it != latencies_.end(); ++it ) {
117  allModesVector.push_back(it->mode);
118  }
119  // The Latencies are sorted by DetIdAndApv, we need to sort the modes again and then remove duplicates
120  sort( allModesVector.begin(), allModesVector.end() );
121  allModesVector.erase( unique( allModesVector.begin(), allModesVector.end() ), allModesVector.end() );
122 }
123 
125 {
126  uint16_t mode = singleMode();
127  if(mode != 0 ) {
128  if( (mode & READMODEMASK) == READMODEMASK ) return 1;
129  if( (mode & READMODEMASK) == 0 ) return 0;
130  }
131  else {
132  // If we are here the Tracker is not in single mode. Check if it is in single Read-out mode.
133  bool allInPeakMode = true;
134  bool allInDecoMode = true;
135  std::vector<uint16_t> allModesVector;
136  allModes(allModesVector);
137  std::vector<uint16_t>::const_iterator it = allModesVector.begin();
138  if (allModesVector.size() == 1 && allModesVector[0] == 0) allInPeakMode = false;
139  else{
140  for( ; it != allModesVector.end(); ++it ) {
141  if( (*it) % 2 == 0 ) continue;
142  if( ((*it) & READMODEMASK) == READMODEMASK ) allInDecoMode = false;
143  if( ((*it) & READMODEMASK) == 0 ) allInPeakMode = false;
144  }
145  }
146  if( allInPeakMode ) return 1;
147  if( allInDecoMode ) return 0;
148  }
149  return -1;
150 }
151 
152 
153 void SiStripLatency::allLatencies(std::vector<uint16_t> & allLatenciesVector) const
154 {
155 
156  for( latConstIt it = latencies_.begin(); it != latencies_.end(); ++it ) {
157  allLatenciesVector.push_back(it->latency);
158  }
159  // The Latencies are sorted by DetIdAndApv, we need to sort the latencies again and then remove duplicates
160  sort( allLatenciesVector.begin(), allLatenciesVector.end() );
161  allLatenciesVector.erase( unique( allLatenciesVector.begin(), allLatenciesVector.end() ), allLatenciesVector.end() );
162 }
163 
164 
165 std::vector<SiStripLatency::Latency> SiStripLatency::allUniqueLatencyAndModes()
166 {
167  std::vector<Latency> latencyCopy(latencies_);
168  sort( latencyCopy.begin(), latencyCopy.end(), OrderByLatencyAndMode() );
169  latencyCopy.erase( unique( latencyCopy.begin(), latencyCopy.end(), SiStripLatency::EqualByLatencyAndMode() ), latencyCopy.end() );
170  return latencyCopy;
171 }
172 
173 void SiStripLatency::printSummary(std::stringstream & ss) const
174 {
175  ss << std::endl;
176  if(singleReadOutMode()==1){
177  ss << "SingleReadOut = PEAK" << std::endl;
178  }else if(singleReadOutMode()==0){
179  ss << "SingleReadOut = DECO" << std::endl;
180  }else{
181  ss << "SingleReadOut = MIXED" << std::endl;
182  }
183  uint16_t lat = singleLatency();
184  if( lat != 255 ) {
185  ss << "All the Tracker has the same latency = " << lat << std::endl;
186  }
187  else {
188  std::vector<uint16_t> allLatenciesVector;
189  allLatencies(allLatenciesVector);
190  if( allLatenciesVector.size() > 1 ) {
191  ss << "There is more than one latency value in the Tracker" << std::endl;
192  }
193  else {
194  ss << "Latency value is " << lat << " that means invalid" << std::endl;
195  }
196  }
197  ss << "Total number of ranges = " << latencies_.size() << std::endl;
198  printDebug(ss);
199 }
200 
201 
202 void SiStripLatency::printDebug(std::stringstream & ss) const
203 {
204  ss << "List of all the latencies and modes for the " << latencies_.size() << " ranges in the object:" << std::endl;
205  for( latConstIt it = latencies_.begin(); it != latencies_.end(); ++it ) {
206  int detId = it->detIdAndApv >> 3;
207  int apv = it->detIdAndApv & 7; // 7 is 0...0111
208  ss << "for detId = " << detId << " and apv pair = " << apv << " latency = " << int(it->latency) << " and mode = " << int(it->mode) << std::endl;
209  }
210 }
211 
212 #undef READMODEMASK
bool put(const uint32_t detId, const uint16_t apv, const uint16_t latency, const uint16_t mode)
std::vector< Latency > allUniqueLatencyAndModes()
int16_t singleReadOutMode() const
std::vector< Latency >::iterator latIt
uint16_t mode(const uint32_t detId, const uint16_t apv) const
void allLatencies(std::vector< uint16_t > &allLatenciesVector) const
Fills the passed vector with all the possible latencies in the Tracker.
uint16_t singleLatency() const
If all the latency values stored are equal return that value, otherwise return -1.
void allModes(std::vector< uint16_t > &allModesVector) const
Fills the passed vector with all the possible modes in the Tracker.
void printSummary(std::stringstream &ss) const
Prints the number of ranges as well as the value of singleLatency and singleMode. ...
uint16_t singleMode() const
const latConstIt position(const uint32_t detId, const uint16_t apv) const
Used to compute the position with the lower_bound binary search.
uint16_t latency(const uint32_t detId, const uint16_t apv) const
std::vector< Latency > latencies_
void printDebug(std::stringstream &ss) const
Prints the full list of all ranges and corresponding values of latency and mode.
std::vector< Latency >::const_iterator latConstIt
tuple cout
Definition: gather_cfg.py:121
std::pair< uint16_t, uint16_t > latencyAndMode(const uint32_t detId, const uint16_t apv) const
#define READMODEMASK