CMS 3D CMS Logo

SiPixelStatusManager.cc
Go to the documentation of this file.
1 
11 #include <vector>
12 #include <cmath>
13 #include <climits>
14 
15 #include <iostream>
16 
17 using namespace edm;
18 using namespace std;
19 
20 //--------------------------------------------------------------------------------------------------
22 }
23 
24 //--------------------------------------------------------------------------------------------------
26  outputBase_(iConfig.getParameter<ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<std::string>("outputBase")),
27  aveDigiOcc_(iConfig.getParameter<edm::ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<int>("aveDigiOcc")),
28  nLumi_(iConfig.getParameter<edm::ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<int>("resetEveryNLumi")),
29  moduleName_(iConfig.getParameter<ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<std::string>("moduleName")),
30  label_ (iConfig.getParameter<ParameterSet>("SiPixelStatusManagerParameters").getUntrackedParameter<std::string>("label"))
31 {
32 
33  edm::InputTag siPixelStatusTag_(moduleName_, label_);
34  siPixelStatusToken_ = iC.consumes<SiPixelDetectorStatus,edm::InLumi>(siPixelStatusTag_);
35 
36  LogInfo("SiPixelStatusManager")
37  << "Output base: " << outputBase_
38  << std::endl;
39  reset();
40 }
41 
42 //--------------------------------------------------------------------------------------------------
44 }
45 
46 //--------------------------------------------------------------------------------------------------
48  siPixelStatusMap_.clear();
49  siPixelStatusVtr_.clear();
50 }
51 
52 //--------------------------------------------------------------------------------------------------
54 { return (status1.getLSRange().first < status2.getLSRange().first); }
55 
57  if(!siPixelStatusVtr_.empty()){ //only create std::map payloads when the number of non-zero DIGI lumi sections is greater than ZERO otherwise segmentation fault
58 
59  // sort the vector according to lumi
61 
62  // create FEDerror25 ROCs and bad ROCs from PCL
65 
66  // realse the cost of siPixelStatusVtr_ since it is not needed anymore
67  siPixelStatusVtr_.clear();
68 
69  }
70 
71 }
72 
73 //--------------------------------------------------------------------------------------------------
75 
76  edm::Handle<SiPixelDetectorStatus> siPixelStatusHandle;
77  iLumi.getByToken(siPixelStatusToken_, siPixelStatusHandle);
78 
79  if(siPixelStatusHandle.isValid()) { // check the product
80  SiPixelDetectorStatus tmpStatus = (*siPixelStatusHandle);
81  if(tmpStatus.digiOccDET()>0){ // only put in SiPixelDetectorStatus with non zero digi (pixel hit)
82  siPixelStatusVtr_.push_back(tmpStatus);
83  }
84  }
85  else {
86  edm::LogWarning("SiPixelStatusManager")
87  << " SiPixelDetectorStatus is not valid for run "<<iLumi.run()<<" lumi "<<iLumi.luminosityBlock()<< std::endl;
88  }
89 
90 }
91 
92 //--------------------------------------------------------------------------------------------------
94 
95  siPixelStatusVtr_iterator firstStatus = siPixelStatusVtr_.begin();
97 
98  siPixelStatusMap_.clear();
99 
100  if(outputBase_ == "nLumibased" && nLumi_>1){ // doesn't work for nLumi_=1 cos any integer can be completely divided by 1
101 
102  // if the total number of Lumi Blocks can't be completely divided by nLumi_,
103  // the residual Lumi Blocks will be as the last IOV
104  int iterationLumi = 0;
105 
106  LuminosityBlockNumber_t tmpLumi;
107  SiPixelDetectorStatus tmpSiPixelStatus;
108  for (siPixelStatusVtr_iterator it = firstStatus; it != lastStatus; it++) {
109 
110  // this is the begining of an IOV
111  if(iterationLumi%nLumi_==0){
112  tmpLumi = edm::LuminosityBlockNumber_t(it->getLSRange().first);
113  tmpSiPixelStatus = (*it);
114  }
115 
116  // keep update detector status up to nLumi_ lumi sections
117  if(iterationLumi%nLumi_>0){
118  tmpSiPixelStatus.updateDetectorStatus((*it));
119  tmpSiPixelStatus.setLSRange(int(tmpLumi), (*it).getLSRange().second);
120  }
121 
122  siPixelStatusVtr_iterator currentIt = it;
123  siPixelStatusVtr_iterator nextIt = (++currentIt);
124  // wirte out if current lumi is the last lumi-section in the IOV
125  if(iterationLumi%nLumi_==nLumi_-1 || nextIt==lastStatus)
126  {
127  // fill it into a new map (with IOV structured)
128  siPixelStatusMap_[tmpLumi] = tmpSiPixelStatus;
129  }
130 
131  iterationLumi=iterationLumi+1;
132  }
133 
134  // check whether there is not enough number of Lumi in the last IOV
135  // (only when siPixelStatusVtr_.size() > nLumi_ or equivalently current siPixelStatusMap_.size()>1
136  // (otherwise there will be only one IOV, and not previous IOV before the last IOV)
137  // and the number of lumi can not be completely divided by the nLumi_.
138  // (then the number of lumis in the last IOV is equal to the residual, which is less than nLumi_)
139  // if it is, combine last IOV with the IOV before it
140  if(siPixelStatusVtr_.size()%nLumi_!=0 && siPixelStatusMap_.size()>1){
141 
142  // start from the iterator of the end of std::map
144  // the last IOV
145  siPixelStatusMap_iterator iterLastIOV = std::prev(iterEnd);
146  // the IOV before the last IOV
147  siPixelStatusMap_iterator iterBeforeLastIOV = std::prev(iterLastIOV);
148 
149  // combine the last IOV data to the IOV before the last IOV
150  (iterBeforeLastIOV->second).updateDetectorStatus(iterLastIOV->second);
151  (iterBeforeLastIOV->second).setLSRange((iterBeforeLastIOV->second).getLSRange().first, (iterLastIOV->second).getLSRange().second);
152 
153  // delete the last IOV, so the IOV before the last IOV becomes the new last IOV
154  siPixelStatusMap_.erase(iterLastIOV);
155 
156  }
157 
158  }
159  else if(outputBase_ == "dynamicLumibased"){
160 
161  double aveDigiOcc = 1.0*aveDigiOcc_;
162 
164  SiPixelDetectorStatus tmpSiPixelStatus;
165  bool isNewIOV = true;
166 
167  int counter = 0;
168  for (siPixelStatusVtr_iterator it = firstStatus; it != lastStatus; it++) {
169 
170  if(isNewIOV){ // if it is new IOV, init with the current data
171  tmpLumi = edm::LuminosityBlockNumber_t(it->getLSRange().first);
172  tmpSiPixelStatus = (*it);
173  }
174  else{ // if it is not new IOV, append current data
175  tmpSiPixelStatus.updateDetectorStatus((*it));
176  tmpSiPixelStatus.setLSRange(int(tmpLumi),(*it).getLSRange().second);
177  }
178 
179  // if reaching the end of data, write the last IOV to the map whatsoevec
180  siPixelStatusVtr_iterator currentIt = it;
181  siPixelStatusVtr_iterator nextIt = (++currentIt);
182  if(tmpSiPixelStatus.perRocDigiOcc()<aveDigiOcc && nextIt!=lastStatus){
183  isNewIOV = false; // if digi occ is not enough, next data will not belong to new IOV
184  }
185  else{ // if (accunumated) digi occ is enough, write the data to the map
186  isNewIOV = true;
187  siPixelStatusMap_[tmpLumi]=tmpSiPixelStatus;
188  // so next loop is the begining of a new IOV
189  }
190  counter++;
191 
192  } // end of siPixelStatusMap
193 
194  // check whether last IOV has enough statistics
195  // (ONLY when there are more than oneIOV(otherwise there is NO previous IOV before the last IOV) )
196  // if not, combine with previous IOV
197  if(siPixelStatusMap_.size()>1){
198 
199  // start from the end iterator of the std::map
201  // the last IOV
202  siPixelStatusMap_iterator iterLastIOV = std::prev(iterEnd);
203  // if the statistics of the last IOV is not enough
204  if((iterLastIOV->second).perRocDigiOcc()<aveDigiOcc){
205  // the IOV before the last IOV of the map
206  siPixelStatusMap_iterator iterBeforeLastIOV = std::prev(iterLastIOV);
207  // combine the last IOV data to the IOV before the last IOV
208  (iterBeforeLastIOV->second).updateDetectorStatus(iterLastIOV->second);
209  (iterBeforeLastIOV->second).setLSRange((iterBeforeLastIOV->second).getLSRange().first, (iterLastIOV->second).getLSRange().second);
210  // erase the last IOV, so the IOV before the last IOV becomes the new last IOV
211  siPixelStatusMap_.erase(iterLastIOV);
212  }
213 
214  }
215 
216  }
217  else if(outputBase_ == "runbased" || ( (int(siPixelStatusVtr_.size()) <= nLumi_ && outputBase_ == "nLumibased")) ){
218 
219  edm::LuminosityBlockNumber_t tmpLumi = edm::LuminosityBlockNumber_t(firstStatus->getLSRange().first);
220  SiPixelDetectorStatus tmpSiPixelStatus = (*firstStatus);
221 
222  siPixelStatusVtr_iterator nextStatus = ++siPixelStatusVtr_.begin();
223  for (siPixelStatusVtr_iterator it = nextStatus; it != lastStatus; it++) {
224  tmpSiPixelStatus.updateDetectorStatus((*it));
225  tmpSiPixelStatus.setLSRange(int(tmpLumi),(*it).getLSRange().second);
226  }
227 
228  siPixelStatusMap_[tmpLumi] = tmpSiPixelStatus;
229 
230  }
231  else{
232  LogInfo("SiPixelStatusManager")
233  << "Unrecognized payload outputBase parameter: " << outputBase_
234  << endl;
235  }
236 
237 
238 }
239 
240 
242 
243  // initialize the first IOV and SiPixelDetector status (in the first IOV)
244  siPixelStatusVtr_iterator firstStatus = siPixelStatusVtr_.begin();
245  edm::LuminosityBlockNumber_t firstLumi = edm::LuminosityBlockNumber_t(firstStatus->getLSRange().first);
246  SiPixelDetectorStatus firstFEDerror25 = (*firstStatus);
247  FEDerror25Map_[firstLumi] = firstFEDerror25.getFEDerror25Rocs();
248 
249  siPixelStatusVtr_iterator lastStatus = siPixelStatusVtr_.end();
250 
252  bool sameAsLastIOV = true;
253  edm::LuminosityBlockNumber_t previousLumi = firstLumi;
254 
255  siPixelStatusVtr_iterator secondStatus = ++siPixelStatusVtr_.begin();
256  for (siPixelStatusVtr_iterator it = secondStatus; it != lastStatus; it++) {
257  // init for each lumi section (iterator)
258  edm::LuminosityBlockNumber_t tmpLumi = edm::LuminosityBlockNumber_t(it->getLSRange().first);
259  SiPixelDetectorStatus tmpFEDerror25 = (*it);
260 
261  std::map<int,std::vector<int> >tmpBadRocLists = tmpFEDerror25.getFEDerror25Rocs();
262 
263  std::map<int, SiPixelModuleStatus>::iterator itModEnd = tmpFEDerror25.end();
264  for (std::map<int, SiPixelModuleStatus>::iterator itMod = tmpFEDerror25.begin(); itMod != itModEnd; ++itMod)
265  {
266  int detid = itMod->first;
267  // if the badroc list differs for any detid, update the payload
268  if(tmpBadRocLists[detid]!=(FEDerror25Map_[previousLumi])[detid]){
269  sameAsLastIOV = false;
270  break; // jump out of the loop once a new payload is found
271  }
272  }
273 
274  if(sameAsLastIOV==false){
275  //only write new IOV when this Lumi is not equal to the previous one
276  FEDerror25Map_[tmpLumi] = tmpBadRocLists;
277  // and reset
278  previousLumi = tmpLumi;
279  sameAsLastIOV = true;
280 
281  }
282 
283  }
284 
285 }
void updateDetectorStatus(SiPixelDetectorStatus newData)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
unsigned long int digiOccDET()
edm::EDGetTokenT< SiPixelDetectorStatus > siPixelStatusToken_
std::map< int, std::vector< int > > getFEDerror25Rocs()
unsigned int LuminosityBlockNumber_t
LuminosityBlockNumber_t luminosityBlock() const
std::vector< SiPixelDetectorStatus >::iterator siPixelStatusVtr_iterator
RunNumber_t run() const
void setLSRange(int ls0, int ls1)
bool isValid() const
Definition: HandleBase.h:74
std::map< edm::LuminosityBlockNumber_t, std::map< int, std::vector< int > > > FEDerror25Map_
std::vector< SiPixelDetectorStatus > siPixelStatusVtr_
std::map< edm::LuminosityBlockNumber_t, SiPixelDetectorStatus > siPixelStatusMap_
std::pair< int, int > getLSRange()
std::map< edm::LuminosityBlockNumber_t, SiPixelDetectorStatus >::iterator siPixelStatusMap_iterator
HLT enums.
static bool rankByLumi(SiPixelDetectorStatus status1, SiPixelDetectorStatus status2)
void readLumi(const edm::LuminosityBlock &)