CMS 3D CMS Logo

SiStripQuality Class Reference

Description: <one line="" class="" summary>="">. More...

#include <SiStripQuality.cc>

Inheritance diagram for SiStripQuality:

SiStripBadStrip

List of all members.

Public Member Functions

void add (const SiStripDetCabling *)
void add (const SiStripBadStrip *)
void add (const uint32_t &, const SiStripBadStrip::Range &)
void addInvalidConnectionFromCabling ()
void addNotConnectedConnectionFromCabling ()
bool cleanUp (bool force=false)
void clear ()
void compact (unsigned int &, std::vector< unsigned int > &)
void fillBadComponents ()
short getBadApvs (const uint32_t &detid) const
const std::vector< BadComponent > & getBadComponentList () const
short getBadFibers (const uint32_t &detid) const
edm::FileInPath getFileInPath () const
bool IsApvBad (const uint32_t &detid, const short &apvNb) const
bool IsFiberBad (const uint32_t &detid, const short &fiberNb) const
bool IsModuleBad (const uint32_t &detid) const
bool IsModuleUsable (const uint32_t &detid) const
bool IsStripBad (const Range &range, const short &strip) const
bool IsStripBad (const uint32_t &detid, const short &strip) const
int nBadStripsOnTheLeft (const Range &range, const short &strip) const
int nBadStripsOnTheRight (const Range &range, const short &strip) const
bool operator!= (const SiStripQuality &) const
SiStripQualityoperator+= (const SiStripQuality &)
const SiStripQuality operator- (const SiStripQuality &) const
SiStripQualityoperator-= (const SiStripQuality &)
bool operator== (const SiStripQuality &) const
void ReduceGranularity (double)
 SiStripQuality (const SiStripQuality &)
 SiStripQuality (edm::FileInPath &)
 SiStripQuality ()
 ~SiStripQuality ()

Private Member Functions

void compact (std::vector< unsigned int > &, std::vector< unsigned int > &, unsigned short &)
bool put_replace (const uint32_t &DetId, Range input)
void subtract (std::vector< unsigned int > &, const std::vector< unsigned int > &)
void subtraction (std::vector< unsigned int > &, const unsigned int &)

Private Attributes

std::vector< BadComponentBadComponentVect
edm::FileInPath FileInPath_
SiStripDetInfoFileReaderreader
const SiStripDetCablingSiStripDetCabling_
bool toCleanUp

Classes

struct  BadComponent
class  BadComponentStrictWeakOrdering


Detailed Description

Description: <one line="" class="" summary>="">.

Usage: <usage>

Definition at line 31 of file SiStripQuality.h.


Constructor & Destructor Documentation

SiStripQuality::SiStripQuality (  ) 

Definition at line 9 of file SiStripQuality.cc.

References FileInPath_, edm::FileInPath::fullPath(), and reader.

Referenced by operator-().

00009                               :
00010   toCleanUp(false),
00011   FileInPath_("CalibTracker/SiStripCommon/data/SiStripDetInfo.dat"),
00012   SiStripDetCabling_(NULL){
00013   reader=new SiStripDetInfoFileReader(FileInPath_.fullPath());
00014 }

SiStripQuality::SiStripQuality ( edm::FileInPath file  ) 

Definition at line 16 of file SiStripQuality.cc.

References FileInPath_, edm::FileInPath::fullPath(), and reader.

SiStripQuality::SiStripQuality ( const SiStripQuality other  ) 

Definition at line 20 of file SiStripQuality.cc.

References BadComponentVect, FileInPath_, SiStripBadStrip::indexes, reader, SiStripDetCabling_, toCleanUp, and SiStripBadStrip::v_badstrips.

00020                                                          {
00021   FileInPath_=other.FileInPath_;
00022   reader=new SiStripDetInfoFileReader(*(other.reader));
00023   toCleanUp=other.toCleanUp;
00024   indexes=other.indexes;
00025   v_badstrips=other.v_badstrips;
00026   BadComponentVect=other.BadComponentVect;
00027   SiStripDetCabling_=other.SiStripDetCabling_;
00028 }

SiStripQuality::~SiStripQuality (  )  [inline]

Definition at line 51 of file SiStripQuality.h.

References lat::endl(), LogTrace, and reader.

00051                    { 
00052     LogTrace("SiStripQuality") << "SiStripQuality destructor" << std::endl; 
00053     delete reader;
00054   }


Member Function Documentation

void SiStripQuality::add ( const SiStripDetCabling cab  ) 

Definition at line 91 of file SiStripQuality.cc.

References addInvalidConnectionFromCabling(), addNotConnectedConnectionFromCabling(), and SiStripDetCabling_.

void SiStripQuality::add ( const SiStripBadStrip base  ) 

Definition at line 156 of file SiStripQuality.cc.

References lat::endl(), SiStripBadStrip::getDataVectorBegin(), SiStripBadStrip::getRegistryVectorBegin(), SiStripBadStrip::getRegistryVectorEnd(), and LogTrace.

00156                                                    {
00157   SiStripBadStrip::RegistryIterator basebegin = base->getRegistryVectorBegin();
00158   SiStripBadStrip::RegistryIterator baseend   = base->getRegistryVectorEnd();
00159   
00160   //the Registry already contains data
00161   //Loop on detids
00162   for (SiStripBadStrip::RegistryIterator basep=basebegin; basep != baseend; ++basep) {
00163     uint32_t detid=basep->detid;
00164     LogTrace("SiStripQuality") << "add detid " <<detid << std::endl;
00165     
00166     SiStripBadStrip::Range baserange = SiStripBadStrip::Range( base->getDataVectorBegin()+basep->ibegin , base->getDataVectorBegin()+basep->iend );
00167     
00168     add(detid,baserange);
00169   }
00170 }

void SiStripQuality::add ( const uint32_t &  detid,
const SiStripBadStrip::Range baserange 
)

Definition at line 172 of file SiStripQuality.cc.

References compact(), SiStripBadStrip::decode(), lat::endl(), SiStripBadStrip::data::firstStrip, SiStripBadStrip::data::flag, SiStripDetInfoFileReader::getNumberOfApvsAndStripLength(), SiStripBadStrip::getRange(), LogTrace, put_replace(), range, SiStripBadStrip::data::range, reader, and tmp.

00172                                                                                    {
00173  std::vector<unsigned int> vect, tmp;
00174 
00175  unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
00176     
00177  //Is this detid already in the collections owned by this class?
00178  SiStripBadStrip::Range range = getRange(detid);
00179  
00180  //Append bad strips  
00181  tmp.clear();
00182  if (range.first==range.second){
00183    LogTrace("SiStripQuality") << "new detid" << std::endl;
00184    //It's a new detid
00185    tmp.insert(tmp.end(),baserange.first,baserange.second);
00186    std::stable_sort(tmp.begin(),tmp.end());
00187    LogTrace("SiStripQuality") << "ordered" << std::endl;
00188  } else {
00189    LogTrace("SiStripQuality") << "already exists" << std::endl;
00190    //alredy existing detid
00191    
00192    //if full det is bad go to next detid
00193    SiStripBadStrip::data data_=decode(*(range.first));
00194    if(range.second-range.first==1
00195       && data_.firstStrip==0
00196       && data_.range>=Nstrips){
00197      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;
00198      return;
00199    }
00200                 
00201    tmp.insert(tmp.end(),baserange.first,baserange.second);
00202    tmp.insert(tmp.end(),range.first,range.second);
00203    std::stable_sort(tmp.begin(),tmp.end());
00204    LogTrace("SiStripQuality") << "ordered" << std::endl;
00205  }
00206  //Compact data
00207  compact(tmp,vect,Nstrips);
00208  SiStripBadStrip::Range newrange(vect.begin(),vect.end());
00209  if ( ! put_replace(detid,newrange) )
00210    edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
00211 }

void SiStripQuality::addInvalidConnectionFromCabling (  ) 

Definition at line 116 of file SiStripQuality.cc.

References SiStripDetCabling::addActiveDetectorsRawIds(), SiStripBadStrip::encode(), lat::endl(), SiStripDetCabling::getConnections(), sistrip::invalid_, LogTrace, SiStripDetCabling::nApvPairs(), range, and SiStripDetCabling_.

Referenced by add().

00116                                                     {
00117 
00118   std::vector<uint32_t> connected_detids;
00119   SiStripDetCabling_->addActiveDetectorsRawIds(connected_detids);
00120   std::vector<uint32_t>::const_iterator itdet = connected_detids.begin();
00121   std::vector<uint32_t>::const_iterator itdetEnd = connected_detids.end();
00122   for(;itdet!=itdetEnd;++itdet){
00123     //LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] looking at detid " <<*itdet << std::endl;
00124     const std::vector<FedChannelConnection>& fedconns=SiStripDetCabling_->getConnections(*itdet);
00125     std::vector<FedChannelConnection>::const_iterator itconns=fedconns.begin();
00126     std::vector<FedChannelConnection>::const_iterator itconnsEnd=fedconns.end();
00127     
00128     unsigned short nApvPairs=SiStripDetCabling_->nApvPairs(*itdet);
00129     short ngoodConn=0, goodConn=0;
00130     for(;itconns!=itconnsEnd;++itconns){
00131       //LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] apvpair " << itconns->apvPairNumber() << " napvpair " << itconns->nApvPairs()<< " detid " << itconns->detId() << std::endl;
00132       if(itconns->nApvPairs()==sistrip::invalid_)
00133         continue;
00134       ngoodConn++;
00135       goodConn = goodConn | ( 0x1 << itconns->apvPairNumber() );
00136     }
00137 
00138     if (ngoodConn!=nApvPairs){
00139       std::vector<unsigned int> vect;
00140       for (size_t idx=0;idx<nApvPairs;++idx){
00141         if( !(goodConn & ( 0x1 << idx)) ) {
00142           short firstStrip=idx*256;
00143           short range=256;
00144           LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] add detid " <<*itdet << "firstStrip " << firstStrip<< std::endl;
00145           vect.push_back(encode(firstStrip,range));
00146         }
00147       }
00148       if(!vect.empty()){
00149         SiStripBadStrip::Range Range(vect.begin(),vect.end());
00150         add(*itdet,Range);
00151       }
00152     }
00153   }
00154 }

void SiStripQuality::addNotConnectedConnectionFromCabling (  ) 

Definition at line 97 of file SiStripQuality.cc.

References SiStripBadStrip::encode(), lat::endl(), SiStripDetInfoFileReader::getAllData(), SiStripDetCabling::IsConnected(), iter, LogTrace, range, reader, and SiStripDetCabling_.

Referenced by add().

00097                                                          {
00098   
00099   std::map<uint32_t, SiStripDetInfoFileReader::DetInfo > allData = reader->getAllData();
00100   std::map<uint32_t, SiStripDetInfoFileReader::DetInfo >::const_iterator iter=allData.begin();
00101   std::map<uint32_t, SiStripDetInfoFileReader::DetInfo >::const_iterator iterEnd=allData.end();
00102   std::vector<unsigned int> vect;
00103   short firstStrip=0;
00104   short range=0;
00105   for(;iter!=iterEnd;++iter)
00106     if (!SiStripDetCabling_->IsConnected(iter->first)){
00107       vect.clear();
00108       range=iter->second.nApvs*128;
00109       LogTrace("SiStripQuality") << "[addNotConnectedConnectionFromCabling] add detid " << iter->first << std::endl;
00110       vect.push_back(encode(firstStrip,range));
00111       SiStripBadStrip::Range Range(vect.begin(),vect.end());
00112       add(iter->first,Range);
00113     }
00114 }

bool SiStripQuality::cleanUp ( bool  force = false  ) 

Definition at line 372 of file SiStripQuality.cc.

References lat::endl(), SiStripBadStrip::indexes, LogTrace, SiStripBadStrip::put(), range, toCleanUp, and SiStripBadStrip::v_badstrips.

Referenced by operator+=(), operator-=(), and SiStripQualityConfigurableFakeESSource::produce().

00372                                       {
00373 
00374   if (!toCleanUp && !force)
00375     return false;
00376 
00377   toCleanUp=false;
00378 
00379   std::vector<unsigned int> v_badstrips_tmp=v_badstrips;
00380   std::vector<DetRegistry> indexes_tmp=indexes;
00381 
00382   LogTrace("SiStripQuality") << "[SiStripQuality::cleanUp] before cleanUp v_badstrips.size()= " << v_badstrips.size() << " indexes.size()=" << indexes.size() << std::endl;
00383 
00384   v_badstrips.clear();
00385   indexes.clear();
00386 
00387   SiStripBadStrip::RegistryIterator basebegin = indexes_tmp.begin();
00388   SiStripBadStrip::RegistryIterator baseend   = indexes_tmp.end();
00389 
00390   for (SiStripBadStrip::RegistryIterator basep=basebegin; basep != baseend; ++basep) {
00391     if(basep->ibegin!=basep->iend){
00392       SiStripBadStrip::Range range( v_badstrips_tmp.begin()+basep->ibegin, v_badstrips_tmp.begin()+basep->iend );
00393       if ( ! put(basep->detid,range) )
00394         edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
00395     }
00396   }
00397   
00398   LogTrace("SiStripQuality") << "[SiStripQuality::cleanUp] after cleanUp v_badstrips.size()= " << v_badstrips.size() << " indexes.size()=" << indexes.size() << std::endl;
00399   return true;
00400 }

void SiStripQuality::clear ( void   )  [inline]

Definition at line 56 of file SiStripQuality.h.

References BadComponentVect, SiStripBadStrip::indexes, toCleanUp, and SiStripBadStrip::v_badstrips.

Referenced by SiStripHotStripAlgorithmFromClusterOccupancy::extractBadStrips().

00056               {
00057     v_badstrips.clear();
00058     indexes.clear();
00059     BadComponentVect.clear();
00060     toCleanUp=false;
00061   }

void SiStripQuality::compact ( std::vector< unsigned int > &  tmp,
std::vector< unsigned int > &  vect,
unsigned short &  Nstrips 
) [private]

Definition at line 295 of file SiStripQuality.cc.

References SiStripBadStrip::decode(), SiStripBadStrip::encode(), SiStripBadStrip::data::firstStrip, it, and SiStripBadStrip::data::range.

00295                                                                                                               {
00296   SiStripBadStrip::data fs_0, fs_1;
00297   vect.clear();
00298 
00299   ContainerIterator it=tmp.begin();
00300   fs_0=decode(*it);
00301    
00302   //Check if at the module end
00303   if (fs_0.firstStrip+fs_0.range>=Nstrips){
00304     vect.push_back(encode(fs_0.firstStrip,Nstrips-fs_0.firstStrip));
00305     return;
00306   }
00307 
00308   ++it;
00309   for(;it!=tmp.end();++it){
00310     fs_1=decode(*it);
00311     
00312     if (fs_0.firstStrip+fs_0.range>=fs_1.firstStrip+fs_1.range){
00313       //fs_0 includes fs_1, go ahead
00314     } else if (fs_0.firstStrip+fs_0.range>=fs_1.firstStrip){
00315       // contiguous or superimposed intervals
00316       //Check if at the module end
00317       if (fs_1.firstStrip+fs_1.range>=Nstrips){
00318         vect.push_back(encode(fs_0.firstStrip,Nstrips-fs_0.firstStrip));
00319         return;
00320       }else{
00321         //create new fs_0
00322         fs_0.range=fs_1.firstStrip+fs_1.range-fs_0.firstStrip;
00323       }
00324     } else{
00325       //separated intervals
00326       vect.push_back(encode(fs_0.firstStrip,fs_0.range));
00327       fs_0=fs_1;
00328     }
00329   }
00330   vect.push_back(encode(fs_0.firstStrip,fs_0.range));
00331 }

void SiStripQuality::compact ( unsigned int detid,
std::vector< unsigned int > &  vect 
)

Definition at line 213 of file SiStripQuality.cc.

References SiStripDetInfoFileReader::getNumberOfApvsAndStripLength(), reader, and tmp.

Referenced by add(), SiStripCondObjBuilderFromDb::buildStripRelatedObjects(), and SiStripHotStripAlgorithmFromClusterOccupancy::extractBadStrips().

00213                                                                               {
00214   std::vector<unsigned int> tmp=vect;
00215   vect.clear();
00216   std::stable_sort(tmp.begin(),tmp.end());
00217   unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
00218   compact(tmp,vect,Nstrips);
00219 }

void SiStripQuality::fillBadComponents (  ) 

Definition at line 402 of file SiStripQuality.cc.

References SiStripQuality::BadComponent::BadApvs, BadComponentVect, SiStripQuality::BadComponent::BadFibers, SiStripQuality::BadComponent::BadModule, SiStripBadStrip::decode(), SiStripQuality::BadComponent::detid, SiStripBadStrip::data::firstStrip, SiStripDetInfoFileReader::getNumberOfApvsAndStripLength(), SiStripBadStrip::indexes, it, range, SiStripBadStrip::data::range, reader, HLT_VtxMuL3::result, and SiStripBadStrip::v_badstrips.

Referenced by SiStripHotStripAlgorithmFromClusterOccupancy::extractBadStrips(), operator+=(), and operator-=().

00402                                       {
00403   
00404   BadComponentVect.clear();
00405   
00406   for (SiStripBadStrip::RegistryIterator basep=indexes.begin(); basep != indexes.end(); ++basep) {
00407     
00408     SiStripBadStrip::Range range( v_badstrips.begin()+basep->ibegin, v_badstrips.begin()+basep->iend );
00409     
00410     //Fill BadModules, BadFibers, BadApvs vectors
00411     unsigned short resultA=0, resultF=0;
00412     BadComponent result;
00413     
00414     SiStripBadStrip::data fs;
00415     unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(basep->detid).first*128;
00416     
00417     //BadModules
00418     fs=decode(*(range.first));
00419     if (basep->iend - basep->ibegin == 1 &&
00420         fs.firstStrip==0 && 
00421         fs.range==Nstrips ){
00422       result.detid=basep->detid;
00423       result.BadModule=true;
00424       result.BadFibers=(1<< (Nstrips/256))-1; 
00425       result.BadApvs=(1<< (Nstrips/128))-1; 
00426         
00427       BadComponentVect.push_back(result);
00428       
00429     } else {
00430 
00431       //Bad Fibers and  Apvs
00432       for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
00433         fs=decode(*it);
00434       
00435         //BadApvs
00436         for(short apvNb=0;apvNb<6;++apvNb){
00437           if ( fs.firstStrip<=apvNb*128 && (apvNb+1)*128<=fs.firstStrip+fs.range ){
00438             resultA=resultA | (1<<apvNb);
00439           }     
00440         }
00441         //BadFibers
00442         for(short fiberNb=0;fiberNb<3;++fiberNb){
00443           if ( fs.firstStrip<=fiberNb*256 && (fiberNb+1)*256<=fs.firstStrip+fs.range ){
00444             resultF=resultF | (1<<fiberNb);
00445           }     
00446         }
00447       }
00448       if (resultA!=0){
00449         result.detid=basep->detid;
00450         result.BadModule=false;
00451         result.BadFibers=resultF;
00452         result.BadApvs=resultA;
00453         BadComponentVect.push_back(result);    
00454       }
00455     }
00456   }
00457 }

short SiStripQuality::getBadApvs ( const uint32_t &  detid  )  const

Definition at line 541 of file SiStripQuality.cc.

References BadComponentVect, and p.

Referenced by SiStripRecHitConverterAlgorithm::fillBad128StripBlocks(), and MeasurementTracker::initializeStripStatus().

00541                                                            {
00542   std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
00543   if (p!=BadComponentVect.end() && p->detid==detid)
00544     return p->BadApvs;
00545   return 0;
00546 }

const std::vector<BadComponent>& SiStripQuality::getBadComponentList (  )  const [inline]

Definition at line 111 of file SiStripQuality.h.

References BadComponentVect.

Referenced by SiStripQualityConfigurableFakeESSource::produce().

00111 { return BadComponentVect; }   

short SiStripQuality::getBadFibers ( const uint32_t &  detid  )  const

Definition at line 548 of file SiStripQuality.cc.

References BadComponentVect, and p.

Referenced by SiStripRecHitConverterAlgorithm::fillBad128StripBlocks(), and MeasurementTracker::initializeStripStatus().

00548                                                              {
00549   std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
00550   if (p!=BadComponentVect.end() && p->detid==detid)
00551     return p->BadFibers;
00552   return 0;
00553 } 

edm::FileInPath SiStripQuality::getFileInPath (  )  const [inline]

Definition at line 81 of file SiStripQuality.h.

References FileInPath_.

00081 {return FileInPath_;}

bool SiStripQuality::IsApvBad ( const uint32_t &  detid,
const short &  apvNb 
) const

Definition at line 490 of file SiStripQuality.cc.

References BadComponentVect, and p.

00490                                                                             {
00491   std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
00492   if (p!=BadComponentVect.end() && p->detid==detid)
00493     return ((p->BadApvs>>apvNb)&0x1);
00494   return false;
00495 }

bool SiStripQuality::IsFiberBad ( const uint32_t &  detid,
const short &  fiberNb 
) const

Definition at line 483 of file SiStripQuality.cc.

References BadComponentVect, and p.

00483                                                                                 {
00484   std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
00485   if (p!=BadComponentVect.end() && p->detid==detid)
00486     return ((p->BadFibers>>fiberNb)&0x1);
00487   return false;
00488 }

bool SiStripQuality::IsModuleBad ( const uint32_t &  detid  )  const

Definition at line 475 of file SiStripQuality.cc.

References BadComponentVect, and p.

00475                                                            {  
00476 
00477   std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
00478   if (p!=BadComponentVect.end() && p->detid==detid)
00479     return p->BadModule;
00480   return false;
00481 }

bool SiStripQuality::IsModuleUsable ( const uint32_t &  detid  )  const

Definition at line 461 of file SiStripQuality.cc.

References BadComponentVect, SiStripDetCabling::IsConnected(), NULL, p, and SiStripDetCabling_.

Referenced by MeasurementTracker::initializeStripStatus(), and SiStripRecHitConverterAlgorithm::run().

00461                                                               {  
00462 
00463   std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
00464   if (p!=BadComponentVect.end() && p->detid==detid)
00465     if(p->BadModule)
00466       return false;
00467 
00468   if (SiStripDetCabling_!=NULL)
00469     if(!SiStripDetCabling_->IsConnected(detid))
00470       return false;
00471 
00472   return true;
00473 }

bool SiStripQuality::IsStripBad ( const Range range,
const short &  strip 
) const

Definition at line 502 of file SiStripQuality.cc.

References SiStripBadStrip::decode(), SiStripBadStrip::data::firstStrip, it, SiStripBadStrip::data::range, and HLT_VtxMuL3::result.

00502                                                                            {
00503   bool result=false;
00504   SiStripBadStrip::data fs;
00505   for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
00506     fs=decode(*it);
00507     if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
00508       result=true;
00509       break;
00510     }      
00511   }
00512   return result;
00513 }

bool SiStripQuality::IsStripBad ( const uint32_t &  detid,
const short &  strip 
) const

Definition at line 497 of file SiStripQuality.cc.

References SiStripBadStrip::getRange(), and range.

Referenced by SiStripThreeThresholdAlgo::add().

00497                                                                               {
00498   SiStripBadStrip::Range range=getRange(detid);
00499   return IsStripBad(range,strip);
00500 }

int SiStripQuality::nBadStripsOnTheLeft ( const Range range,
const short &  strip 
) const

Definition at line 515 of file SiStripQuality.cc.

References SiStripBadStrip::decode(), SiStripBadStrip::data::firstStrip, it, SiStripBadStrip::data::range, and HLT_VtxMuL3::result.

00515                                                                                    {
00516   int result=0;
00517   SiStripBadStrip::data fs;
00518   for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
00519     fs=decode(*it);
00520     if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
00521       result=strip-fs.firstStrip+1;
00522       break;
00523     }      
00524   }
00525   return result;
00526 }

int SiStripQuality::nBadStripsOnTheRight ( const Range range,
const short &  strip 
) const

Definition at line 528 of file SiStripQuality.cc.

References SiStripBadStrip::decode(), SiStripBadStrip::data::firstStrip, it, SiStripBadStrip::data::range, and HLT_VtxMuL3::result.

00528                                                                                     {
00529   int result=0;
00530   SiStripBadStrip::data fs;
00531   for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
00532     fs=decode(*it);
00533     if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
00534       result=fs.firstStrip+fs.range-strip;
00535       break;
00536     }      
00537   }
00538   return result;
00539 }

bool SiStripQuality::operator!= ( const SiStripQuality other  )  const

Definition at line 88 of file SiStripQuality.cc.

00088 { return !(*this == other) ; }

SiStripQuality & SiStripQuality::operator+= ( const SiStripQuality other  ) 

Definition at line 31 of file SiStripQuality.cc.

References cleanUp(), and fillBadComponents().

00031                                                                       { 
00032   this->add(&other); 
00033   this->cleanUp(); 
00034   this->fillBadComponents(); 
00035   return *this; 
00036 }

const SiStripQuality SiStripQuality::operator- ( const SiStripQuality other  )  const

Definition at line 80 of file SiStripQuality.cc.

References SiStripQuality().

00080                                                                                  {
00081   return SiStripQuality(*this) -= other; 
00082 }

SiStripQuality & SiStripQuality::operator-= ( const SiStripQuality other  ) 

Definition at line 38 of file SiStripQuality.cc.

References cleanUp(), SiStripBadStrip::decode(), lat::endl(), fillBadComponents(), SiStripBadStrip::data::firstStrip, SiStripBadStrip::getDataVectorBegin(), SiStripDetInfoFileReader::getNumberOfApvsAndStripLength(), SiStripBadStrip::getRange(), SiStripBadStrip::getRegistryVectorBegin(), SiStripBadStrip::getRegistryVectorEnd(), put_replace(), range, SiStripBadStrip::data::range, reader, and subtract().

00038                                                                       {
00039     
00040   SiStripBadStrip::RegistryIterator rbegin = other.getRegistryVectorBegin();
00041   SiStripBadStrip::RegistryIterator rend   = other.getRegistryVectorEnd();
00042   std::vector<unsigned int> ovect,vect;
00043   uint32_t detid;
00044   unsigned short Nstrips;
00045     
00046   for (SiStripBadStrip::RegistryIterator rp=rbegin; rp != rend; ++rp) {
00047     
00048     detid=rp->detid;
00049     Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
00050     
00051     SiStripBadStrip::Range orange = SiStripBadStrip::Range( other.getDataVectorBegin()+rp->ibegin , other.getDataVectorBegin()+rp->iend );
00052     
00053     //Is this detid already in the collections owned by this class?
00054     SiStripBadStrip::Range range = getRange(detid);   
00055     if (range.first!=range.second){ //yes, it is
00056 
00057       vect.clear();
00058       ovect.clear();
00059 
00060       //if other full det is bad, remove det from this
00061       SiStripBadStrip::data data_=decode(*(orange.first));
00062       if(orange.second-orange.first!=1
00063          || data_.firstStrip!=0
00064          || data_.range<Nstrips){
00065         
00066         ovect.insert(ovect.end(),orange.first,orange.second);
00067         vect.insert(vect.end(),range.first,range.second);
00068         subtract(vect,ovect);
00069       } 
00070       SiStripBadStrip::Range newrange(vect.begin(),vect.end());
00071       if ( ! put_replace(detid,newrange) )
00072         edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
00073     }
00074   }
00075   cleanUp(); 
00076   fillBadComponents(); 
00077   return *this; 
00078 }

bool SiStripQuality::operator== ( const SiStripQuality other  )  const

Definition at line 84 of file SiStripQuality.cc.

References a, SiStripBadStrip::getRegistryVectorBegin(), and SiStripBadStrip::getRegistryVectorEnd().

00084                                                                  {
00085   SiStripQuality a = (*this) - other ;
00086   return a.getRegistryVectorBegin()==a.getRegistryVectorEnd();
00087 }

bool SiStripQuality::put_replace ( const uint32_t &  DetId,
Range  input 
) [private]

Definition at line 221 of file SiStripQuality.cc.

References SiStripBadStrip::DetRegistry::detid, lat::endl(), SiStripBadStrip::DetRegistry::ibegin, SiStripBadStrip::DetRegistry::iend, SiStripBadStrip::indexes, LogTrace, p, toCleanUp, and SiStripBadStrip::v_badstrips.

Referenced by add(), and operator-=().

00221                                                                    {
00222   // put in SiStripQuality::v_badstrips of DetId
00223   Registry::iterator p = std::lower_bound(indexes.begin(),indexes.end(),DetId,SiStripBadStrip::StrictWeakOrdering());
00224 
00225   size_t sd= input.second-input.first;
00226   DetRegistry detregistry;
00227   detregistry.detid=DetId;
00228   detregistry.ibegin=v_badstrips.size();
00229   detregistry.iend=v_badstrips.size()+sd;
00230 
00231   v_badstrips.insert(v_badstrips.end(),input.first,input.second);
00232 
00233   if (p!=indexes.end() && p->detid==DetId){
00234     LogTrace("SiStripQuality") << "[SiStripQuality::put_replace]  Replacing SiStripQuality for already stored DetID " << DetId << std::endl;
00235     toCleanUp=true;
00236     *p=detregistry;
00237   } else {
00238     indexes.insert(p,detregistry);
00239   }
00240 
00241   return true;
00242 }

void SiStripQuality::ReduceGranularity ( double  threshold  ) 

Definition at line 250 of file SiStripQuality.cc.

References SiStripBadStrip::decode(), SiStripBadStrip::encode(), SiStripBadStrip::data::firstStrip, SiStripBadStrip::getDataVectorBegin(), SiStripBadStrip::getRegistryVectorBegin(), SiStripBadStrip::getRegistryVectorEnd(), i, it, LogTrace, max, min, and SiStripBadStrip::data::range.

00250                                                       {
00251 
00252   SiStripBadStrip::RegistryIterator rp = getRegistryVectorBegin();
00253   SiStripBadStrip::RegistryIterator rend   = getRegistryVectorEnd();
00254   SiStripBadStrip::data data_;
00255   uint16_t BadStripPerApv[6], ipos;
00256   std::vector<unsigned int> vect;
00257 
00258   for (; rp != rend; ++rp) {
00259     uint32_t detid=rp->detid;
00260 
00261     BadStripPerApv[0]=0;    BadStripPerApv[1]=0;    BadStripPerApv[2]=0;    BadStripPerApv[3]=0;    BadStripPerApv[4]=0;    BadStripPerApv[5]=0;
00262     ipos=0;
00263 
00264     SiStripBadStrip::Range sqrange = SiStripBadStrip::Range( getDataVectorBegin()+rp->ibegin , getDataVectorBegin()+rp->iend );
00265     
00266     for(int it=0;it<sqrange.second-sqrange.first;it++){
00267 
00268       data_=decode( *(sqrange.first+it) );
00269       LogTrace("SiStripQuality") << "[SiStripQuality::ReduceGranularity] detid " << detid << " first strip " << data_.firstStrip << " lastStrip " << data_.firstStrip+data_.range-1  << " range " << data_.range;
00270       ipos= data_.firstStrip/128;
00271       while (ipos<=(data_.firstStrip+data_.range-1)/128){
00272         BadStripPerApv[ipos]+=std::min(data_.firstStrip+data_.range,(ipos+1)*128)-std::max(data_.firstStrip*1,ipos*128);
00273         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);
00274         ipos++;
00275       }
00276     }
00277 
00278     LogTrace("SiStripQuality") << "[SiStripQuality::ReduceGranularity] Total for detid " << detid << " values " << BadStripPerApv[0] << " " << BadStripPerApv[1] << " " << BadStripPerApv[2] << " " <<BadStripPerApv[3] << " " <<BadStripPerApv[4] << " " << BadStripPerApv[5];
00279     
00280     
00281     vect.clear();
00282     for(size_t i=0;i<6;++i){
00283       if (BadStripPerApv[i]>=threshold*128){
00284         vect.push_back(encode(i*128,128));
00285       }
00286     }
00287     if(!vect.empty()){
00288       SiStripBadStrip::Range Range(vect.begin(),vect.end());
00289       add(detid,Range);
00290     }
00291   }
00292 }

void SiStripQuality::subtract ( std::vector< unsigned int > &  A,
const std::vector< unsigned int > &  B 
) [private]

Definition at line 333 of file SiStripQuality.cc.

References it, and subtraction().

Referenced by operator-=().

00333                                                                                         {
00334   ContainerIterator it=B.begin();
00335   ContainerIterator itend=B.end();
00336   for(;it!=itend;++it){    
00337     subtraction(A,*it);
00338   }
00339 }

void SiStripQuality::subtraction ( std::vector< unsigned int > &  A,
const unsigned int B 
) [private]

Definition at line 341 of file SiStripQuality.cc.

References SiStripBadStrip::decode(), SiStripBadStrip::encode(), SiStripBadStrip::data::firstStrip, SiStripBadStrip::data::range, and tmp.

Referenced by subtract().

00341                                                                                 {
00342   SiStripBadStrip::data fs_A, fs_B, fs_m, fs_M;
00343   std::vector<unsigned int> tmp;
00344 
00345   fs_B=decode(B);
00346   ContainerIterator jt=A.begin();
00347   ContainerIterator jtend=A.end();
00348   for(;jt!=jtend;++jt){
00349     fs_A=decode(*jt);
00350     if (B<*jt){
00351       fs_m=fs_B;
00352       fs_M=fs_A;
00353     }else{
00354       fs_m=fs_A;
00355       fs_M=fs_B;
00356     }
00357     //A) Verify the range to be subtracted crosses the new range
00358     if (fs_m.firstStrip+fs_m.range>fs_M.firstStrip){
00359       if (*jt<B){
00360         tmp.push_back(encode(fs_A.firstStrip,fs_B.firstStrip-fs_A.firstStrip));
00361       }
00362       if (fs_A.firstStrip+fs_A.range>fs_B.firstStrip+fs_B.range){
00363         tmp.push_back(encode(fs_B.firstStrip+fs_B.range,fs_A.firstStrip+fs_A.range-(fs_B.firstStrip+fs_B.range)));
00364       }
00365     }else{
00366       tmp.push_back(*jt);
00367     }
00368   } 
00369   A=tmp;
00370 }


Member Data Documentation

std::vector<BadComponent> SiStripQuality::BadComponentVect [private]

Definition at line 126 of file SiStripQuality.h.

Referenced by clear(), fillBadComponents(), getBadApvs(), getBadComponentList(), getBadFibers(), IsApvBad(), IsFiberBad(), IsModuleBad(), IsModuleUsable(), and SiStripQuality().

edm::FileInPath SiStripQuality::FileInPath_ [private]

Definition at line 123 of file SiStripQuality.h.

Referenced by getFileInPath(), and SiStripQuality().

SiStripDetInfoFileReader* SiStripQuality::reader [private]

Definition at line 124 of file SiStripQuality.h.

Referenced by add(), addNotConnectedConnectionFromCabling(), compact(), fillBadComponents(), operator-=(), SiStripQuality(), and ~SiStripQuality().

const SiStripDetCabling* SiStripQuality::SiStripDetCabling_ [private]

Definition at line 128 of file SiStripQuality.h.

Referenced by add(), addInvalidConnectionFromCabling(), addNotConnectedConnectionFromCabling(), IsModuleUsable(), and SiStripQuality().

bool SiStripQuality::toCleanUp [private]

Definition at line 122 of file SiStripQuality.h.

Referenced by cleanUp(), clear(), put_replace(), and SiStripQuality().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:32:30 2009 for CMSSW by  doxygen 1.5.4