CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripQuality.cc
Go to the documentation of this file.
1 //
2 // Author: Domenico Giordano
3 // Created: Wed Sep 26 17:42:12 CEST 2007
4 //
11 
12 
13 // Needed only for output
19 
20 #include <boost/bind.hpp>
21 #include <boost/function.hpp>
22 
24  toCleanUp(false),
25  FileInPath_("CalibTracker/SiStripCommon/data/SiStripDetInfo.dat"),
26  SiStripDetCabling_(NULL),
27  printDebug_(false),
28  useEmptyRunInfo_(false)
29 {
30  reader=new SiStripDetInfoFileReader(FileInPath_.fullPath());
31 }
32 
33 SiStripQuality::SiStripQuality(edm::FileInPath& file):toCleanUp(false),FileInPath_(file),SiStripDetCabling_(NULL), printDebug_(false), useEmptyRunInfo_(false)
34 {
35  reader=new SiStripDetInfoFileReader(FileInPath_.fullPath());
36 }
37 
39 {
40  FileInPath_=other.FileInPath_;
41  reader=new SiStripDetInfoFileReader(*(other.reader));
42  toCleanUp=other.toCleanUp;
43  indexes=other.indexes;
44  v_badstrips=other.v_badstrips;
45  BadComponentVect=other.BadComponentVect;
46  SiStripDetCabling_=other.SiStripDetCabling_;
47  printDebug_=other.printDebug_;
48  useEmptyRunInfo_=other.useEmptyRunInfo_;
49 }
50 
51 SiStripQuality::~SiStripQuality(){
52  LogTrace("SiStripQuality") << "SiStripQuality destructor" << std::endl;
53  delete reader;
54 }
55 
56 
58 {
59  this->add(&other);
60  this->cleanUp();
61  this->fillBadComponents();
62  return *this;
63 }
64 
66 {
67  SiStripBadStrip::RegistryIterator rbegin = other.getRegistryVectorBegin();
68  SiStripBadStrip::RegistryIterator rend = other.getRegistryVectorEnd();
69  std::vector<unsigned int> ovect,vect;
70  uint32_t detid;
71  unsigned short Nstrips;
72 
73  for (SiStripBadStrip::RegistryIterator rp=rbegin; rp != rend; ++rp) {
74 
75  detid=rp->detid;
76  Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
77 
78  SiStripBadStrip::Range orange = SiStripBadStrip::Range( other.getDataVectorBegin()+rp->ibegin , other.getDataVectorBegin()+rp->iend );
79 
80  //Is this detid already in the collections owned by this class?
81  SiStripBadStrip::Range range = getRange(detid);
82  if (range.first!=range.second){ //yes, it is
83 
84  vect.clear();
85  ovect.clear();
86 
87  //if other full det is bad, remove det from this
88  SiStripBadStrip::data data_=decode(*(orange.first));
89  if(orange.second-orange.first!=1
90  || data_.firstStrip!=0
91  || data_.range<Nstrips){
92 
93  ovect.insert(ovect.end(),orange.first,orange.second);
94  vect.insert(vect.end(),range.first,range.second);
95  subtract(vect,ovect);
96  }
97  SiStripBadStrip::Range newrange(vect.begin(),vect.end());
98  if ( ! put_replace(detid,newrange) )
99  edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
100  }
101  }
102  cleanUp();
103  fillBadComponents();
104  return *this;
105 }
106 
108 {
109  return SiStripQuality(*this) -= other;
110 }
111 
112 bool SiStripQuality::operator ==(const SiStripQuality& other) const
113 {
114  SiStripQuality a = (*this) - other ;
115  return a.getRegistryVectorBegin()==a.getRegistryVectorEnd();
116 }
117 
118 bool SiStripQuality::operator !=(const SiStripQuality& other) const { return !(*this == other) ; }
119 
120 void SiStripQuality::add(const SiStripDetVOff *Voff)
121 {
122  std::vector<unsigned int> vect;
123  short firstStrip=0;
124  short range=0;
125 
126  //Get vector of Voff dets
127  std::vector<uint32_t> vdets;
128  Voff->getDetIds(vdets);
129  std::vector<uint32_t>::const_iterator iter=vdets.begin();
130  std::vector<uint32_t>::const_iterator iterEnd=vdets.end();
131 
132  for(;iter!=iterEnd;++iter){
133  vect.clear();
134  range = (short) (reader->getNumberOfApvsAndStripLength(*iter).first*128.);
135  LogTrace("SiStripQuality") << "[add Voff] add detid " << *iter << " first strip " << firstStrip << " range " << range << std::endl;
136  vect.push_back(encode(firstStrip,range));
137  SiStripBadStrip::Range Range(vect.begin(),vect.end());
138  add(*iter,Range);
139  }
140 }
141 
142 void SiStripQuality::add(const RunInfo *runInfo)
143 {
144  bool allFedsEmpty = runInfo->m_fed_in.empty();
145  if( allFedsEmpty ) {
146  std::stringstream ss;
147  ss << "WARNING: the full list of feds in RunInfo is empty. ";
148  if( useEmptyRunInfo_ ) {
149  ss << " SiStripQuality will still use it and all tracker will be off." << std::endl;
150  }
151  else {
152  ss << " SiStripQuality will not use it." << std::endl;
153  }
154  edm::LogInfo("SiStripQuality") << ss.str();
155  }
156 
157  if( !allFedsEmpty || useEmptyRunInfo_ ) {
158  // Take the list of active feds from fedCabling
159  auto ids = SiStripDetCabling_->fedCabling()->fedIds();
160 
161  std::vector<uint16_t> activeFedsFromCabling(ids.begin(), ids.end());
162  // Take the list of active feds from RunInfo
163  std::vector<int> activeFedsFromRunInfo;
164  // Take only Tracker feds (remove all non Tracker)
165  std::remove_copy_if( runInfo->m_fed_in.begin(),
166  runInfo->m_fed_in.end(),
167  std::back_inserter(activeFedsFromRunInfo),
168  !boost::bind(std::logical_and<bool>(),
169  boost::bind(std::greater_equal<int>(), _1, int(FEDNumbering::MINSiStripFEDID)),
170  boost::bind(std::less_equal<int>(), _1, int(FEDNumbering::MAXSiStripFEDID))) );
171 
172  // Compare the two. If a fedId from RunInfo is not present in the fedCabling we need to
173  // get all the corresponding fedChannels and then the single apv pairs and use them to
174  // turn off the corresponding strips (apvNumber*256).
175  // set_difference returns the set of elements that are in the first and not in the second
176  std::sort(activeFedsFromCabling.begin(), activeFedsFromCabling.end());
177  std::sort(activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end());
178  std::vector<int> differentFeds;
179  // Take the feds active for cabling but not for runInfo
180  std::set_difference(activeFedsFromCabling.begin(), activeFedsFromCabling.end(),
181  activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end(),
182  std::back_inserter(differentFeds));
183 
184  // IGNORE for time being.
185  //printActiveFedsInfo(activeFedsFromCabling, activeFedsFromRunInfo, differentFeds, printDebug_);
186 
187  // Feds in the differentFeds vector are now to be turned off as they are off according to RunInfo
188  // but were not off in cabling and thus are still active for the SiStripQuality.
189  // The "true" means that the strips are to be set as bad.
190  turnOffFeds(differentFeds, true, printDebug_);
191 
192  // Consistency check
193  // -----------------
194  std::vector<int> check;
195  std::set_difference(activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end(),
196  activeFedsFromCabling.begin(), activeFedsFromCabling.end(),
197  std::back_inserter(check));
198  // This must not happen
199  if( !check.empty() ) {
200  // throw cms::Exception("LogicError")
201  edm::LogWarning("SiStripQuality")
202  << "The cabling should always include the active feds in runInfo and possibly have some more"
203  << "there are instead " << check.size() << " feds only active in runInfo";
204  // The "false" means that we are only printing the output, but not setting the strips as bad.
205  // The second bool means that we always want the debug output in this case.
206  turnOffFeds(check, false, true);
207  }
208  }
209 }
210 
211 void SiStripQuality::add(const SiStripDetCabling *cab)
212 {
213  SiStripDetCabling_=cab;
214  addInvalidConnectionFromCabling();
215  addNotConnectedConnectionFromCabling();
216 }
217 
218 void SiStripQuality::addNotConnectedConnectionFromCabling()
219 {
220  std::map<uint32_t, SiStripDetInfoFileReader::DetInfo > allData = reader->getAllData();
221  std::map<uint32_t, SiStripDetInfoFileReader::DetInfo >::const_iterator iter=allData.begin();
222  std::map<uint32_t, SiStripDetInfoFileReader::DetInfo >::const_iterator iterEnd=allData.end();
223  std::vector<unsigned int> vect;
224  short firstStrip=0;
225  short range=0;
226  for(;iter!=iterEnd;++iter)
227  if (!SiStripDetCabling_->IsConnected(iter->first)){
228  vect.clear();
229  range=iter->second.nApvs*128;
230  LogTrace("SiStripQuality") << "[addNotConnectedConnectionFromCabling] add detid " << iter->first << std::endl;
231  vect.push_back(encode(firstStrip,range));
232  SiStripBadStrip::Range Range(vect.begin(),vect.end());
233  add(iter->first,Range);
234  }
235 }
236 
237 void SiStripQuality::addInvalidConnectionFromCabling()
238 {
239  std::vector<uint32_t> connected_detids;
240  SiStripDetCabling_->addActiveDetectorsRawIds(connected_detids);
241  std::vector<uint32_t>::const_iterator itdet = connected_detids.begin();
242  std::vector<uint32_t>::const_iterator itdetEnd = connected_detids.end();
243  for(;itdet!=itdetEnd;++itdet){
244  //LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] looking at detid " <<*itdet << std::endl;
245  const std::vector<const FedChannelConnection *>& fedconns=SiStripDetCabling_->getConnections(*itdet);
246  std::vector<const FedChannelConnection *>::const_iterator itconns=fedconns.begin();
247  std::vector<const FedChannelConnection *>::const_iterator itconnsEnd=fedconns.end();
248 
249  unsigned short nApvPairs=SiStripDetCabling_->nApvPairs(*itdet);
250  short ngoodConn=0, goodConn=0;
251  for(;itconns!=itconnsEnd;++itconns){
252  //LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] apvpair " << (*itconns)->apvPairNumber() << " napvpair " << (*itconns)->nApvPairs()<< " detid " << (*itconns)->detId() << std::endl;
253  if( (*itconns == 0) || ((*itconns)->nApvPairs()==sistrip::invalid_) )
254  continue;
255  ngoodConn++;
256  goodConn = goodConn | ( 0x1 << (*itconns)->apvPairNumber() );
257  }
258 
259  if (ngoodConn!=nApvPairs){
260  std::vector<unsigned int> vect;
261  for (size_t idx=0;idx<nApvPairs;++idx){
262  if( !(goodConn & ( 0x1 << idx)) ) {
263  short firstStrip=idx*256;
264  short range=256;
265  LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] add detid " <<*itdet << "firstStrip " << firstStrip<< std::endl;
266  vect.push_back(encode(firstStrip,range));
267  }
268  }
269  if(!vect.empty()){
270  SiStripBadStrip::Range Range(vect.begin(),vect.end());
271  add(*itdet,Range);
272  }
273  }
274  }
275 }
276 
278 {
281 
282  //the Registry already contains data
283  //Loop on detids
284  for (SiStripBadStrip::RegistryIterator basep=basebegin; basep != baseend; ++basep) {
285  uint32_t detid=basep->detid;
286  LogTrace("SiStripQuality") << "add detid " <<detid << std::endl;
287 
288  SiStripBadStrip::Range baserange = SiStripBadStrip::Range( base->getDataVectorBegin()+basep->ibegin , base->getDataVectorBegin()+basep->iend );
289 
290  add(detid,baserange);
291  }
292 }
293 
294 void SiStripQuality::add(const uint32_t& detid,const SiStripBadStrip::Range& baserange)
295 {
296  std::vector<unsigned int> vect, tmp;
297 
298  unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
299 
300  //Is this detid already in the collections owned by this class?
301  SiStripBadStrip::Range range = getRange(detid);
302 
303  //Append bad strips
304  tmp.clear();
305  if (range.first==range.second){
306  LogTrace("SiStripQuality") << "new detid" << std::endl;
307  //It's a new detid
308  tmp.insert(tmp.end(),baserange.first,baserange.second);
309  std::stable_sort(tmp.begin(),tmp.end());
310  LogTrace("SiStripQuality") << "ordered" << std::endl;
311  } else {
312  LogTrace("SiStripQuality") << "already exists" << std::endl;
313  //alredy existing detid
314 
315  //if full det is bad go to next detid
316  SiStripBadStrip::data data_=decode(*(range.first));
317  if(range.second-range.first==1
318  && data_.firstStrip==0
319  && data_.range>=Nstrips){
320  LogTrace("SiStripQuality") << "full det is bad.. " << range.second-range.first << " " << decode(*(range.first)).firstStrip << " " << decode(*(range.first)).range << " " << decode(*(range.first)).flag <<"\n"<< std::endl;
321  return;
322  }
323 
324  tmp.insert(tmp.end(),baserange.first,baserange.second);
325  tmp.insert(tmp.end(),range.first,range.second);
326  std::stable_sort(tmp.begin(),tmp.end());
327  LogTrace("SiStripQuality") << "ordered" << std::endl;
328  }
329  //Compact data
330  compact(tmp,vect,Nstrips);
331  SiStripBadStrip::Range newrange(vect.begin(),vect.end());
332  if ( ! put_replace(detid,newrange) )
333  edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
334 }
335 
336 void SiStripQuality::compact(unsigned int& detid, std::vector<unsigned int>& vect)
337 {
338  std::vector<unsigned int> tmp=vect;
339  vect.clear();
340  std::stable_sort(tmp.begin(),tmp.end());
341  unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
342  compact(tmp,vect,Nstrips);
343 }
344 
345 bool SiStripQuality::put_replace(const uint32_t& DetId, Range input)
346 {
347  // put in SiStripQuality::v_badstrips of DetId
348  Registry::iterator p = std::lower_bound(indexes.begin(),indexes.end(),DetId,SiStripBadStrip::StrictWeakOrdering());
349 
350  size_t sd= input.second-input.first;
351  DetRegistry detregistry;
352  detregistry.detid=DetId;
353  detregistry.ibegin=v_badstrips.size();
354  detregistry.iend=v_badstrips.size()+sd;
355 
356  v_badstrips.insert(v_badstrips.end(),input.first,input.second);
357 
358  if (p!=indexes.end() && p->detid==DetId){
359  LogTrace("SiStripQuality") << "[SiStripQuality::put_replace] Replacing SiStripQuality for already stored DetID " << DetId << std::endl;
360  toCleanUp=true;
361  *p=detregistry;
362  } else {
363  indexes.insert(p,detregistry);
364  }
365 
366  return true;
367 }
368 
369 /*
370 Method to reduce the granularity of badcomponents:
371 if in an apv there are more than ratio*128 bad strips,
372 the full apv is declared as bad.
373 Method needed to help the
374  */
376 {
377  SiStripBadStrip::RegistryIterator rp = getRegistryVectorBegin();
378  SiStripBadStrip::RegistryIterator rend = getRegistryVectorEnd();
379  SiStripBadStrip::data data_;
380  uint16_t BadStripPerApv[6], ipos;
381  std::vector<unsigned int> vect;
382 
383  for (; rp != rend; ++rp) {
384  uint32_t detid=rp->detid;
385 
386  BadStripPerApv[0]=0; BadStripPerApv[1]=0; BadStripPerApv[2]=0; BadStripPerApv[3]=0; BadStripPerApv[4]=0; BadStripPerApv[5]=0;
387  ipos=0;
388 
389  SiStripBadStrip::Range sqrange = SiStripBadStrip::Range( getDataVectorBegin()+rp->ibegin , getDataVectorBegin()+rp->iend );
390 
391  for(int it=0;it<sqrange.second-sqrange.first;it++){
392 
393  data_=decode( *(sqrange.first+it) );
394  LogTrace("SiStripQuality") << "[SiStripQuality::ReduceGranularity] detid " << detid << " first strip " << data_.firstStrip << " lastStrip " << data_.firstStrip+data_.range-1 << " range " << data_.range;
395  ipos= data_.firstStrip/128;
396  while (ipos<=(data_.firstStrip+data_.range-1)/128){
397  BadStripPerApv[ipos]+=std::min(data_.firstStrip+data_.range,(ipos+1)*128)-std::max(data_.firstStrip*1,ipos*128);
398  LogTrace("SiStripQuality") << "[SiStripQuality::ReduceGranularity] ipos " << ipos << " Counter " << BadStripPerApv[ipos] << " min " << std::min(data_.firstStrip+data_.range,(ipos+1)*128) << " max " << std::max(data_.firstStrip*1,ipos*128) << " added " << std::min(data_.firstStrip+data_.range,(ipos+1)*128)-std::max(data_.firstStrip*1,ipos*128);
399  ipos++;
400  }
401  }
402 
403  LogTrace("SiStripQuality") << "[SiStripQuality::ReduceGranularity] Total for detid " << detid << " values " << BadStripPerApv[0] << " " << BadStripPerApv[1] << " " << BadStripPerApv[2] << " " <<BadStripPerApv[3] << " " <<BadStripPerApv[4] << " " << BadStripPerApv[5];
404 
405 
406  vect.clear();
407  for(size_t i=0;i<6;++i){
408  if (BadStripPerApv[i]>=threshold*128){
409  vect.push_back(encode(i*128,128));
410  }
411  }
412  if(!vect.empty()){
413  SiStripBadStrip::Range Range(vect.begin(),vect.end());
414  add(detid,Range);
415  }
416  }
417 }
418 
419 
420 void SiStripQuality::compact(std::vector<unsigned int>& tmp,std::vector<unsigned int>& vect,unsigned short& Nstrips)
421 {
422  SiStripBadStrip::data fs_0, fs_1;
423  vect.clear();
424 
425  ContainerIterator it=tmp.begin();
426  fs_0=decode(*it);
427 
428  //Check if at the module end
429  if (fs_0.firstStrip+fs_0.range>=Nstrips){
430  vect.push_back(encode(fs_0.firstStrip,Nstrips-fs_0.firstStrip));
431  return;
432  }
433 
434  ++it;
435  for(;it!=tmp.end();++it){
436  fs_1=decode(*it);
437 
438  if (fs_0.firstStrip+fs_0.range>=fs_1.firstStrip+fs_1.range){
439  //fs_0 includes fs_1, go ahead
440  } else if (fs_0.firstStrip+fs_0.range>=fs_1.firstStrip){
441  // contiguous or superimposed intervals
442  //Check if at the module end
443  if (fs_1.firstStrip+fs_1.range>=Nstrips){
444  vect.push_back(encode(fs_0.firstStrip,Nstrips-fs_0.firstStrip));
445  return;
446  }else{
447  //create new fs_0
448  fs_0.range=fs_1.firstStrip+fs_1.range-fs_0.firstStrip;
449  }
450  } else{
451  //separated intervals
452  vect.push_back(encode(fs_0.firstStrip,fs_0.range));
453  fs_0=fs_1;
454  }
455  }
456  vect.push_back(encode(fs_0.firstStrip,fs_0.range));
457 }
458 
459 void SiStripQuality::subtract(std::vector<unsigned int>& A,const std::vector<unsigned int>& B)
460 {
461  ContainerIterator it=B.begin();
462  ContainerIterator itend=B.end();
463  for(;it!=itend;++it){
464  subtraction(A,*it);
465  }
466 }
467 
468 void SiStripQuality::subtraction(std::vector<unsigned int>& A,const unsigned int& B)
469 {
470  SiStripBadStrip::data fs_A, fs_B, fs_m, fs_M;
471  std::vector<unsigned int> tmp;
472 
473  fs_B=decode(B);
474  ContainerIterator jt=A.begin();
475  ContainerIterator jtend=A.end();
476  for(;jt!=jtend;++jt){
477  fs_A=decode(*jt);
478  if (B<*jt){
479  fs_m=fs_B;
480  fs_M=fs_A;
481  }else{
482  fs_m=fs_A;
483  fs_M=fs_B;
484  }
485  //A) Verify the range to be subtracted crosses the new range
486  if (fs_m.firstStrip+fs_m.range>fs_M.firstStrip){
487  if (*jt<B){
488  tmp.push_back(encode(fs_A.firstStrip,fs_B.firstStrip-fs_A.firstStrip));
489  }
490  if (fs_A.firstStrip+fs_A.range>fs_B.firstStrip+fs_B.range){
491  tmp.push_back(encode(fs_B.firstStrip+fs_B.range,fs_A.firstStrip+fs_A.range-(fs_B.firstStrip+fs_B.range)));
492  }
493  }else{
494  tmp.push_back(*jt);
495  }
496  }
497  A=tmp;
498 }
499 
500 bool SiStripQuality::cleanUp(bool force)
501 {
502  if (!toCleanUp && !force)
503  return false;
504 
505  toCleanUp=false;
506 
507  std::vector<unsigned int> v_badstrips_tmp=v_badstrips;
508  std::vector<DetRegistry> indexes_tmp=indexes;
509 
510  LogTrace("SiStripQuality") << "[SiStripQuality::cleanUp] before cleanUp v_badstrips.size()= " << v_badstrips.size() << " indexes.size()=" << indexes.size() << std::endl;
511 
512  v_badstrips.clear();
513  indexes.clear();
514 
515  SiStripBadStrip::RegistryIterator basebegin = indexes_tmp.begin();
516  SiStripBadStrip::RegistryIterator baseend = indexes_tmp.end();
517 
518  for (SiStripBadStrip::RegistryIterator basep=basebegin; basep != baseend; ++basep) {
519  if(basep->ibegin!=basep->iend){
520  SiStripBadStrip::Range range( v_badstrips_tmp.begin()+basep->ibegin, v_badstrips_tmp.begin()+basep->iend );
521  if ( ! put(basep->detid,range) )
522  edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
523  }
524  }
525 
526  LogTrace("SiStripQuality") << "[SiStripQuality::cleanUp] after cleanUp v_badstrips.size()= " << v_badstrips.size() << " indexes.size()=" << indexes.size() << std::endl;
527  return true;
528 }
529 
530 void SiStripQuality::fillBadComponents()
531 {
532  BadComponentVect.clear();
533 
534  for (SiStripBadStrip::RegistryIterator basep=indexes.begin(); basep != indexes.end(); ++basep) {
535 
536  SiStripBadStrip::Range range( v_badstrips.begin()+basep->ibegin, v_badstrips.begin()+basep->iend );
537 
538  //Fill BadModules, BadFibers, BadApvs vectors
539  unsigned short resultA=0, resultF=0;
540  BadComponent result;
541 
543  unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(basep->detid).first*128;
544 
545  //BadModules
546  fs=decode(*(range.first));
547  if (basep->iend - basep->ibegin == 1 &&
548  fs.firstStrip==0 &&
549  fs.range==Nstrips ){
550  result.detid=basep->detid;
551  result.BadModule=true;
552  result.BadFibers=(1<< (Nstrips/256))-1;
553  result.BadApvs=(1<< (Nstrips/128))-1;
554 
555  BadComponentVect.push_back(result);
556 
557  } else {
558 
559  //Bad Fibers and Apvs
560  for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
561  fs=decode(*it);
562 
563  //BadApvs
564  for(short apvNb=0;apvNb<6;++apvNb){
565  if ( fs.firstStrip<=apvNb*128 && (apvNb+1)*128<=fs.firstStrip+fs.range ){
566  resultA=resultA | (1<<apvNb);
567  }
568  }
569  //BadFibers
570  for(short fiberNb=0;fiberNb<3;++fiberNb){
571  if ( fs.firstStrip<=fiberNb*256 && (fiberNb+1)*256<=fs.firstStrip+fs.range ){
572  resultF=resultF | (1<<fiberNb);
573  }
574  }
575  }
576  if (resultA!=0){
577  result.detid=basep->detid;
578  result.BadModule=false;
579  result.BadFibers=resultF;
580  result.BadApvs=resultA;
581  BadComponentVect.push_back(result);
582  }
583  }
584  }
585 }
586 
587 //--------------------------------------------------------------//
588 
589 bool SiStripQuality::IsModuleUsable(const uint32_t& detid) const
590 {
591  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
592  if (p!=BadComponentVect.end() && p->detid==detid)
593  if(p->BadModule)
594  return false;
595 
596  if (SiStripDetCabling_!=NULL)
597  if(!SiStripDetCabling_->IsConnected(detid))
598  return false;
599 
600  return true;
601 }
602 
603 bool SiStripQuality::IsModuleBad(const uint32_t& detid) const
604 {
605  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
606  if (p!=BadComponentVect.end() && p->detid==detid)
607  return p->BadModule;
608  return false;
609 }
610 
611 bool SiStripQuality::IsFiberBad(const uint32_t& detid, const short& fiberNb) const
612 {
613  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
614  if (p!=BadComponentVect.end() && p->detid==detid)
615  return ((p->BadFibers>>fiberNb)&0x1);
616  return false;
617 }
618 
619 bool SiStripQuality::IsApvBad(const uint32_t& detid, const short& apvNb) const
620 {
621  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
622  if (p!=BadComponentVect.end() && p->detid==detid)
623  return ((p->BadApvs>>apvNb)&0x1);
624  return false;
625 }
626 
627 bool SiStripQuality::IsStripBad(const uint32_t& detid, const short& strip) const
628 {
629  SiStripBadStrip::Range range=getRange(detid);
630  return IsStripBad(range,strip);
631 }
632 
633 bool SiStripQuality::IsStripBad(const Range& range, const short& strip) const
634 {
635  bool result=false;
637  for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
638  fs=decode(*it);
639  if ( (fs.firstStrip<=strip) & (strip<fs.firstStrip+fs.range) ){
640  result=true;
641  break;
642  }
643  }
644  return result;
645 }
646 
647 int SiStripQuality::nBadStripsOnTheLeft(const Range& range, const short& strip) const
648 {
649  int result=0;
651  for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
652  fs=decode(*it);
653  if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
654  result=strip-fs.firstStrip+1;
655  break;
656  }
657  }
658  return result;
659 }
660 
661 int SiStripQuality::nBadStripsOnTheRight(const Range& range, const short& strip) const
662 {
663  int result=0;
665  for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
666  fs=decode(*it);
667  if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
668  result=fs.firstStrip+fs.range-strip;
669  break;
670  }
671  }
672  return result;
673 }
674 
675 short SiStripQuality::getBadApvs(const uint32_t& detid) const
676 {
677  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
678  if (p!=BadComponentVect.end() && p->detid==detid)
679  return p->BadApvs;
680  return 0;
681 }
682 
683 short SiStripQuality::getBadFibers(const uint32_t& detid) const
684 {
685  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
686  if (p!=BadComponentVect.end() && p->detid==detid)
687  return p->BadFibers;
688  return 0;
689 }
690 
691 void SiStripQuality::printDetInfo(const uint32_t &detId, const uint32_t &apvPairNumber, std::stringstream &ss)
692 {
693  int layer = 0;
694  int stereo = 0;
695  std::string subDetName;
696  DetId detid(detId);
697  switch (detid.subdetId()) {
699  {
700  TIBDetId theTIBDetId(detid.rawId());
701  layer = theTIBDetId.layer();
702  stereo = theTIBDetId.stereo();
703  subDetName = "TIB";
704  break;
705  }
707  {
708  TOBDetId theTOBDetId(detid.rawId());
709  layer = theTOBDetId.layer();
710  stereo = theTOBDetId.stereo();
711  subDetName = "TOB";
712  break;
713  }
715  {
716  TECDetId theTECDetId(detid.rawId());
717  // is this module in TEC+ or TEC-?
718  layer = theTECDetId.wheel();
719  stereo = theTECDetId.stereo();
720  subDetName = "TEC";
721  break;
722  }
724  {
725  TECDetId theTIDDetId(detid.rawId());
726  // is this module in TID+ or TID-?
727  layer = theTIDDetId.wheel();
728  stereo = theTIDDetId.stereo();
729  subDetName = "TID";
730  break;
731  }
732  }
733  ss << detId << " and apv = " << apvPairNumber << " of subDet = " << subDetName << ", layer = " << layer << " stereo = " << stereo << std::endl;
734 }
735 
736 void SiStripQuality::printActiveFedsInfo( const std::vector<uint16_t> & activeFedsFromCabling,
737  const std::vector<int> & activeFedsFromRunInfo,
738  const std::vector<int> & differentFeds,
739  const bool printDebug )
740 {
741  std::ostringstream ss;
742 
743  if( printDebug ) {
744  ss << "activeFedsFromCabling:" << std::endl;
745  std::copy(activeFedsFromCabling.begin(), activeFedsFromCabling.end(), std::ostream_iterator<uint16_t>(ss, " "));
746  ss << std::endl;
747  ss << "activeFedsFromRunInfo:" << std::endl;
748  std::copy(activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end(), std::ostream_iterator<int>(ss, " "));
749  ss << std::endl;
750  }
751  if( differentFeds.size() != 440 ) {
752  ss << "differentFeds : " << std::endl;
753  std::copy(differentFeds.begin(), differentFeds.end(), std::ostream_iterator<int>(ss, " "));
754  ss << std::endl;
755  }
756  else {
757  ss << "There are 440 feds (all) active for Cabling but off for RunInfo. Tracker was probably not in this run" << std::endl;
758  }
759  edm::LogInfo("SiStripQuality") << ss.str() << std::endl;
760 }
761 
762 void SiStripQuality::turnOffFeds(const std::vector<int> & fedsList, const bool turnOffStrips, const bool printDebug)
763 {
764 
765  std::stringstream ss;
766  if( printDebug ) {
767  ss << "associated to detIds : " << std::endl;
768  }
769 
770  std::vector<int>::const_iterator fedIdIt = fedsList.begin();
771  for( ; fedIdIt != fedsList.end(); ++fedIdIt ) {
772  std::vector<FedChannelConnection>::const_iterator fedChIt = SiStripDetCabling_->fedCabling()->fedConnections( *fedIdIt ).begin();
773  for( ; fedChIt != SiStripDetCabling_->fedCabling()->fedConnections( *fedIdIt ).end(); ++fedChIt ) {
774  uint32_t detId = fedChIt->detId();
775  if (detId == 0 || detId == 0xFFFFFFFF) continue;
776  uint16_t apvPairNumber = fedChIt->apvPairNumber();
777 
778  if( printDebug ) {
779  printDetInfo(detId, apvPairNumber, ss);
780  }
781 
782  if( turnOffStrips ) {
783  // apvPairNumber == i it means that the i*256 strips are to be set off
784  std::vector<unsigned int> vect;
785  vect.push_back(encode(apvPairNumber*256,256));
786  SiStripBadStrip::Range Range(vect.begin(), vect.end());
787  add(detId,Range);
788  LogTrace("SiStripQuality") << "[addOffForRunInfo] adding apvPairNumber "<<apvPairNumber<<" for detId "<<detId<<" off according to RunInfo" << std::endl;
789  }
790  }
791  }
792  if( printDebug ) {
793  edm::LogInfo("SiStripQuality") << ss.str() << std::endl;
794  }
795 }
unsigned short range
tuple base
Main Program
Definition: newFWLiteAna.py:92
int i
Definition: DBlmapReader.cc:9
unsigned int layer() const
layer id
Definition: TOBDetId.h:39
std::vector< unsigned int >::const_iterator ContainerIterator
MatrixMeschach operator-(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
Basic3DVector & operator-=(const Basic3DVector< U > &p)
bool operator!=(debugging_allocator< X > const &, debugging_allocator< Y > const &)
void add(const std::vector< const T * > &source, std::vector< const T * > &dest)
#define NULL
Definition: scimark2.h:8
Registry::const_iterator RegistryIterator
static std::string const input
Definition: EdmProvDump.cc:44
void put(edm::Event &evt, double value, const char *instanceName)
RegistryIterator getRegistryVectorEnd() const
const T & max(const T &a, const T &b)
void getDetIds(std::vector< uint32_t > &DetIds_) const
std::vector< int > m_fed_in
Definition: RunInfo.h:26
bool check(const DataFrame &df, bool capcheck, bool dvercheck)
tuple result
Definition: query.py:137
bool operator==(const QGLikelihoodParameters &lhs, const QGLikelihoodCategory &rhs)
Test if parameters are compatible with category.
bool decode(bool &, std::string const &)
Definition: types.cc:62
std::pair< typename T::DetSet::const_iterator, typename T::DetSet::const_iterator > getRange(const T &detset, const DetId &id)
#define LogTrace(id)
ContainerIterator getDataVectorBegin() const
Definition: DetId.h:18
PixelRecoRange< float > Range
unsigned short firstStrip
double sd
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
static const uint16_t invalid_
Definition: Constants.h:16
unsigned int wheel() const
wheel id
Definition: TECDetId.h:52
void cleanUp(const std::string &connectionString, std::set< std::string > exclusionList=std::set< std::string >())
Definition: SchemaUtils.cc:22
unsigned int layer() const
layer id
Definition: TIBDetId.h:41
RegistryIterator getRegistryVectorBegin() const
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
double a
Definition: hdecay.h:121
std::pair< ContainerIterator, ContainerIterator > Range
volatile std::atomic< bool > shutdown_flag false
Basic3DVector & operator+=(const Basic3DVector< U > &p)