CMS 3D CMS Logo

Classes | Public Member Functions | Private Member Functions | Private Attributes

SiStripQuality Class Reference

#include <SiStripQuality.cc>

Inheritance diagram for SiStripQuality:
SiStripBadStrip

List of all members.

Classes

struct  BadComponent
class  BadComponentStrictWeakOrdering

Public Member Functions

void add (const uint32_t &, const SiStripBadStrip::Range &)
void add (const SiStripDetCabling *)
void add (const SiStripDetVOff *)
void add (const RunInfo *)
void add (const SiStripBadStrip *)
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)
void setPrintDebugOutput (const bool printDebug)
void setUseEmptyRunInfo (const bool useEmptyRunInfo)
 SiStripQuality ()
 SiStripQuality (edm::FileInPath &)
 SiStripQuality (const SiStripQuality &)
 ~SiStripQuality ()

Private Member Functions

void compact (std::vector< unsigned int > &, std::vector< unsigned int > &, unsigned short &)
void printActiveFedsInfo (const std::vector< uint16_t > &activeFedsFromCabling, const std::vector< int > &activeFedsFromRunInfo, const std::vector< int > &differentFeds, const bool printDebug)
 Prints debug output for the active feds comparing the list in RunInfo and FedCabling.
void printDetInfo (const uint32_t &detId, const uint32_t &apvPairNumber, std::stringstream &ss)
 Prints debug output for a given detId.
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 &)
void turnOffFeds (const std::vector< int > &fedsList, const bool turnOffStrips, const bool printDebug)

Private Attributes

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

Detailed Description

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

Usage: <usage>

Definition at line 33 of file SiStripQuality.h.


Constructor & Destructor Documentation

SiStripQuality::SiStripQuality ( )

Definition at line 20 of file SiStripQuality.cc.

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

Referenced by operator-().

                              :
  toCleanUp(false),
  FileInPath_("CalibTracker/SiStripCommon/data/SiStripDetInfo.dat"),
  SiStripDetCabling_(NULL),
  printDebug_(false),
  useEmptyRunInfo_(false)
{
  reader=new SiStripDetInfoFileReader(FileInPath_.fullPath());
}
SiStripQuality::SiStripQuality ( edm::FileInPath file)
SiStripQuality::SiStripQuality ( const SiStripQuality other)
SiStripQuality::~SiStripQuality ( ) [inline]

Definition at line 53 of file SiStripQuality.h.

References LogTrace, and reader.

                   { 
    LogTrace("SiStripQuality") << "SiStripQuality destructor" << std::endl; 
    delete reader;
  }

Member Function Documentation

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

Definition at line 284 of file SiStripQuality.cc.

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

Referenced by add(), addInvalidConnectionFromCabling(), addNotConnectedConnectionFromCabling(), operator+=(), ReduceGranularity(), and turnOffFeds().

{
 std::vector<unsigned int> vect, tmp;

 unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
    
 //Is this detid already in the collections owned by this class?
 SiStripBadStrip::Range range = getRange(detid);
 
 //Append bad strips  
 tmp.clear();
 if (range.first==range.second){
   LogTrace("SiStripQuality") << "new detid" << std::endl;
   //It's a new detid
   tmp.insert(tmp.end(),baserange.first,baserange.second);
   std::stable_sort(tmp.begin(),tmp.end());
   LogTrace("SiStripQuality") << "ordered" << std::endl;
 } else {
   LogTrace("SiStripQuality") << "already exists" << std::endl;
   //alredy existing detid
   
   //if full det is bad go to next detid
   SiStripBadStrip::data data_=decode(*(range.first));
   if(range.second-range.first==1
      && data_.firstStrip==0
      && data_.range>=Nstrips){
     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;
     return;
   }
                
   tmp.insert(tmp.end(),baserange.first,baserange.second);
   tmp.insert(tmp.end(),range.first,range.second);
   std::stable_sort(tmp.begin(),tmp.end());
   LogTrace("SiStripQuality") << "ordered" << std::endl;
 }
 //Compact data
 compact(tmp,vect,Nstrips);
 SiStripBadStrip::Range newrange(vect.begin(),vect.end());
 if ( ! put_replace(detid,newrange) )
   edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
}
void SiStripQuality::add ( const SiStripDetCabling cab)
void SiStripQuality::add ( const SiStripDetVOff Voff)

Definition at line 112 of file SiStripQuality.cc.

References add(), SiStripBadStrip::encode(), SiStripDetVOff::getDetIds(), SiStripDetInfoFileReader::getNumberOfApvsAndStripLength(), LogTrace, and reader.

{
  std::vector<unsigned int> vect;
  short firstStrip=0;
  short range=0;

  //Get vector of Voff dets
  std::vector<uint32_t> vdets;
  Voff->getDetIds(vdets);
  std::vector<uint32_t>::const_iterator iter=vdets.begin();
  std::vector<uint32_t>::const_iterator iterEnd=vdets.end();

  for(;iter!=iterEnd;++iter){
    vect.clear();
    range = (short) (reader->getNumberOfApvsAndStripLength(*iter).first*128.);
    LogTrace("SiStripQuality") << "[add Voff] add detid " << *iter << " first strip " << firstStrip << " range " << range << std::endl;
    vect.push_back(encode(firstStrip,range));
    SiStripBadStrip::Range Range(vect.begin(),vect.end());
    add(*iter,Range);
  }
}
void SiStripQuality::add ( const SiStripBadStrip base)

Definition at line 267 of file SiStripQuality.cc.

References add(), cond::rpcobgas::detid, SiStripBadStrip::getDataVectorBegin(), SiStripBadStrip::getRegistryVectorBegin(), SiStripBadStrip::getRegistryVectorEnd(), and LogTrace.

{
  SiStripBadStrip::RegistryIterator basebegin = base->getRegistryVectorBegin();
  SiStripBadStrip::RegistryIterator baseend   = base->getRegistryVectorEnd();
  
  //the Registry already contains data
  //Loop on detids
  for (SiStripBadStrip::RegistryIterator basep=basebegin; basep != baseend; ++basep) {
    uint32_t detid=basep->detid;
    LogTrace("SiStripQuality") << "add detid " <<detid << std::endl;
    
    SiStripBadStrip::Range baserange = SiStripBadStrip::Range( base->getDataVectorBegin()+basep->ibegin , base->getDataVectorBegin()+basep->iend );
    
    add(detid,baserange);
  }
}
void SiStripQuality::add ( const RunInfo runInfo)

Used to get the cabling from RunInfo.
It compares the feds from cabling with those from runInfo and it turns off all the strips associated to feds that are off for the RunInfo but not for FedCabling.

Definition at line 134 of file SiStripQuality.cc.

References CastorDataFrameFilter_impl::check(), SiStripDetCabling::fedCabling(), SiStripFedCabling::feds(), RunInfo::m_fed_in, FEDNumbering::MAXSiStripFEDID, FEDNumbering::MINSiStripFEDID, printActiveFedsInfo(), printDebug_, SiStripDetCabling_, python::multivaluedict::sort(), turnOffFeds(), and useEmptyRunInfo_.

{
  bool allFedsEmpty = runInfo->m_fed_in.empty();
  if( allFedsEmpty ) {
    std::stringstream ss;
    ss << "WARNING: the full list of feds in RunInfo is empty. ";
    if( useEmptyRunInfo_ ) {
      ss << " SiStripQuality will still use it and all tracker will be off." << std::endl;
    }
    else {
      ss << " SiStripQuality will not use it." << std::endl;
    }
    edm::LogInfo("SiStripQuality") << ss.str();
  }

  if( !allFedsEmpty || useEmptyRunInfo_ ) {
    // Take the list of active feds from fedCabling
    std::vector<uint16_t> activeFedsFromCabling = SiStripDetCabling_->fedCabling()->feds();

    // Take the list of active feds from RunInfo
    std::vector<int> activeFedsFromRunInfo;
    // Take only Tracker feds (remove all non Tracker)
    std::remove_copy_if( runInfo->m_fed_in.begin(),
                         runInfo->m_fed_in.end(),
                         std::back_inserter(activeFedsFromRunInfo),
                         !boost::bind(std::logical_and<bool>(),
                                      boost::bind(std::greater_equal<int>(), _1, int(FEDNumbering::MINSiStripFEDID)),
                                      boost::bind(std::less_equal<int>(), _1, int(FEDNumbering::MAXSiStripFEDID))) );

    // Compare the two. If a fedId from RunInfo is not present in the fedCabling we need to
    // get all the corresponding fedChannels and then the single apv pairs and use them to
    // turn off the corresponding strips (apvNumber*256).
    // set_difference returns the set of elements that are in the first and not in the second
    std::sort(activeFedsFromCabling.begin(), activeFedsFromCabling.end());
    std::sort(activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end());
    std::vector<int> differentFeds;
    // Take the feds active for cabling but not for runInfo
    std::set_difference(activeFedsFromCabling.begin(), activeFedsFromCabling.end(),
                        activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end(),
                        std::back_inserter(differentFeds));

    printActiveFedsInfo(activeFedsFromCabling, activeFedsFromRunInfo, differentFeds, printDebug_);

    // Feds in the differentFeds vector are now to be turned off as they are off according to RunInfo
    // but were not off in cabling and thus are still active for the SiStripQuality.
    // The "true" means that the strips are to be set as bad.
    turnOffFeds(differentFeds, true, printDebug_);

    // Consistency check
    // -----------------
    std::vector<int> check;
    std::set_difference(activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end(),
                        activeFedsFromCabling.begin(), activeFedsFromCabling.end(),
                        std::back_inserter(check));
    // This must not happen
    if( !check.empty() ) {
      // throw cms::Exception("LogicError")
      edm::LogWarning("SiStripQuality") 
        << "The cabling should always include the active feds in runInfo and possibly have some more"
        << "there are instead " << check.size() << " feds only active in runInfo";
      // The "false" means that we are only printing the output, but not setting the strips as bad.
      // The second bool means that we always want the debug output in this case.
      turnOffFeds(check, false, true);
    }
  }
}
void SiStripQuality::addInvalidConnectionFromCabling ( )

Definition at line 227 of file SiStripQuality.cc.

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

Referenced by add().

{
  std::vector<uint32_t> connected_detids;
  SiStripDetCabling_->addActiveDetectorsRawIds(connected_detids);
  std::vector<uint32_t>::const_iterator itdet = connected_detids.begin();
  std::vector<uint32_t>::const_iterator itdetEnd = connected_detids.end();
  for(;itdet!=itdetEnd;++itdet){
    //LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] looking at detid " <<*itdet << std::endl;
    const std::vector<const FedChannelConnection *>& fedconns=SiStripDetCabling_->getConnections(*itdet);
    std::vector<const FedChannelConnection *>::const_iterator itconns=fedconns.begin();
    std::vector<const FedChannelConnection *>::const_iterator itconnsEnd=fedconns.end();
    
    unsigned short nApvPairs=SiStripDetCabling_->nApvPairs(*itdet);
    short ngoodConn=0, goodConn=0;
    for(;itconns!=itconnsEnd;++itconns){
      //LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] apvpair " << (*itconns)->apvPairNumber() << " napvpair " << (*itconns)->nApvPairs()<< " detid " << (*itconns)->detId() << std::endl;
      if( (*itconns == 0) || ((*itconns)->nApvPairs()==sistrip::invalid_) )
        continue;
      ngoodConn++;
      goodConn = goodConn | ( 0x1 << (*itconns)->apvPairNumber() );
    }

    if (ngoodConn!=nApvPairs){
      std::vector<unsigned int> vect;
      for (size_t idx=0;idx<nApvPairs;++idx){
        if( !(goodConn & ( 0x1 << idx)) ) {
          short firstStrip=idx*256;
          short range=256;
          LogTrace("SiStripQuality") << "[addInvalidConnectionFromCabling] add detid " <<*itdet << "firstStrip " << firstStrip<< std::endl;
          vect.push_back(encode(firstStrip,range));
        }
      }
      if(!vect.empty()){
        SiStripBadStrip::Range Range(vect.begin(),vect.end());
        add(*itdet,Range);
      }
    }
  }
}
void SiStripQuality::addNotConnectedConnectionFromCabling ( )

Definition at line 208 of file SiStripQuality.cc.

References add(), SiStripBadStrip::encode(), SiStripDetInfoFileReader::getAllData(), SiStripDetCabling::IsConnected(), LogTrace, reader, and SiStripDetCabling_.

Referenced by add().

{  
  std::map<uint32_t, SiStripDetInfoFileReader::DetInfo > allData = reader->getAllData();
  std::map<uint32_t, SiStripDetInfoFileReader::DetInfo >::const_iterator iter=allData.begin();
  std::map<uint32_t, SiStripDetInfoFileReader::DetInfo >::const_iterator iterEnd=allData.end();
  std::vector<unsigned int> vect;
  short firstStrip=0;
  short range=0;
  for(;iter!=iterEnd;++iter)
    if (!SiStripDetCabling_->IsConnected(iter->first)){
      vect.clear();
      range=iter->second.nApvs*128;
      LogTrace("SiStripQuality") << "[addNotConnectedConnectionFromCabling] add detid " << iter->first << std::endl;
      vect.push_back(encode(firstStrip,range));
      SiStripBadStrip::Range Range(vect.begin(),vect.end());
      add(iter->first,Range);
    }
}
bool SiStripQuality::cleanUp ( bool  force = false)

Definition at line 490 of file SiStripQuality.cc.

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

Referenced by SiStripBadModuleGenerator::createObject(), operator+=(), and operator-=().

{
  if (!toCleanUp && !force)
    return false;

  toCleanUp=false;

  std::vector<unsigned int> v_badstrips_tmp=v_badstrips;
  std::vector<DetRegistry> indexes_tmp=indexes;

  LogTrace("SiStripQuality") << "[SiStripQuality::cleanUp] before cleanUp v_badstrips.size()= " << v_badstrips.size() << " indexes.size()=" << indexes.size() << std::endl;

  v_badstrips.clear();
  indexes.clear();

  SiStripBadStrip::RegistryIterator basebegin = indexes_tmp.begin();
  SiStripBadStrip::RegistryIterator baseend   = indexes_tmp.end();

  for (SiStripBadStrip::RegistryIterator basep=basebegin; basep != baseend; ++basep) {
    if(basep->ibegin!=basep->iend){
      SiStripBadStrip::Range range( v_badstrips_tmp.begin()+basep->ibegin, v_badstrips_tmp.begin()+basep->iend );
      if ( ! put(basep->detid,range) )
        edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
    }
  }
  
  LogTrace("SiStripQuality") << "[SiStripQuality::cleanUp] after cleanUp v_badstrips.size()= " << v_badstrips.size() << " indexes.size()=" << indexes.size() << std::endl;
  return true;
}
void SiStripQuality::clear ( void  ) [inline]
void SiStripQuality::compact ( std::vector< unsigned int > &  tmp,
std::vector< unsigned int > &  vect,
unsigned short &  Nstrips 
) [private]

Definition at line 410 of file SiStripQuality.cc.

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

{
  SiStripBadStrip::data fs_0, fs_1;
  vect.clear();

  ContainerIterator it=tmp.begin();
  fs_0=decode(*it);
   
  //Check if at the module end
  if (fs_0.firstStrip+fs_0.range>=Nstrips){
    vect.push_back(encode(fs_0.firstStrip,Nstrips-fs_0.firstStrip));
    return;
  }

  ++it;
  for(;it!=tmp.end();++it){
    fs_1=decode(*it);
    
    if (fs_0.firstStrip+fs_0.range>=fs_1.firstStrip+fs_1.range){
      //fs_0 includes fs_1, go ahead
    } else if (fs_0.firstStrip+fs_0.range>=fs_1.firstStrip){
      // contiguous or superimposed intervals
      //Check if at the module end
      if (fs_1.firstStrip+fs_1.range>=Nstrips){
        vect.push_back(encode(fs_0.firstStrip,Nstrips-fs_0.firstStrip));
        return;
      }else{
        //create new fs_0
        fs_0.range=fs_1.firstStrip+fs_1.range-fs_0.firstStrip;
      }
    } else{
      //separated intervals
      vect.push_back(encode(fs_0.firstStrip,fs_0.range));
      fs_0=fs_1;
    }
  }
  vect.push_back(encode(fs_0.firstStrip,fs_0.range));
}
void SiStripQuality::compact ( unsigned int &  detid,
std::vector< unsigned int > &  vect 
)
void SiStripQuality::fillBadComponents ( )

Definition at line 520 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, SiStripBadStrip::data::range, reader, query::result, and SiStripBadStrip::v_badstrips.

Referenced by SiStripBadAPVAlgorithmFromClusterOccupancy::extractBadAPVs(), SiStripBadAPVandHotStripAlgorithmFromClusterOccupancy::extractBadAPVSandStrips(), SiStripHotStripAlgorithmFromClusterOccupancy::extractBadStrips(), SiStripHitEffFromCalibTree::makeSQLite(), operator+=(), and operator-=().

{
  BadComponentVect.clear();
  
  for (SiStripBadStrip::RegistryIterator basep=indexes.begin(); basep != indexes.end(); ++basep) {
    
    SiStripBadStrip::Range range( v_badstrips.begin()+basep->ibegin, v_badstrips.begin()+basep->iend );
    
    //Fill BadModules, BadFibers, BadApvs vectors
    unsigned short resultA=0, resultF=0;
    BadComponent result;
    
    SiStripBadStrip::data fs;
    unsigned short Nstrips=reader->getNumberOfApvsAndStripLength(basep->detid).first*128;
    
    //BadModules
    fs=decode(*(range.first));
    if (basep->iend - basep->ibegin == 1 &&
        fs.firstStrip==0 && 
        fs.range==Nstrips ){
      result.detid=basep->detid;
      result.BadModule=true;
      result.BadFibers=(1<< (Nstrips/256))-1; 
      result.BadApvs=(1<< (Nstrips/128))-1; 
        
      BadComponentVect.push_back(result);
      
    } else {

      //Bad Fibers and  Apvs
      for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
        fs=decode(*it);
      
        //BadApvs
        for(short apvNb=0;apvNb<6;++apvNb){
          if ( fs.firstStrip<=apvNb*128 && (apvNb+1)*128<=fs.firstStrip+fs.range ){
            resultA=resultA | (1<<apvNb);
          }     
        }
        //BadFibers
        for(short fiberNb=0;fiberNb<3;++fiberNb){
          if ( fs.firstStrip<=fiberNb*256 && (fiberNb+1)*256<=fs.firstStrip+fs.range ){
            resultF=resultF | (1<<fiberNb);
          }     
        }
      }
      if (resultA!=0){
        result.detid=basep->detid;
        result.BadModule=false;
        result.BadFibers=resultF;
        result.BadApvs=resultA;
        BadComponentVect.push_back(result);    
      }
    }
  }
}
short SiStripQuality::getBadApvs ( const uint32_t &  detid) const

Definition at line 665 of file SiStripQuality.cc.

References BadComponentVect, cond::rpcobgas::detid, and AlCaHLTBitMon_ParallelJobs::p.

Referenced by StMeasurementDetSet::initializeStripStatus().

{
  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
  if (p!=BadComponentVect.end() && p->detid==detid)
    return p->BadApvs;
  return 0;
}
const std::vector<BadComponent>& SiStripQuality::getBadComponentList ( ) const [inline]
short SiStripQuality::getBadFibers ( const uint32_t &  detid) const

Definition at line 673 of file SiStripQuality.cc.

References BadComponentVect, cond::rpcobgas::detid, and AlCaHLTBitMon_ParallelJobs::p.

Referenced by StMeasurementDetSet::initializeStripStatus().

{
  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
  if (p!=BadComponentVect.end() && p->detid==detid)
    return p->BadFibers;
  return 0;
} 
edm::FileInPath SiStripQuality::getFileInPath ( ) const [inline]

Definition at line 91 of file SiStripQuality.h.

References FileInPath_.

{return FileInPath_;}
bool SiStripQuality::IsApvBad ( const uint32_t &  detid,
const short &  apvNb 
) const

Definition at line 609 of file SiStripQuality.cc.

References BadComponentVect, cond::rpcobgas::detid, and AlCaHLTBitMon_ParallelJobs::p.

{
  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
  if (p!=BadComponentVect.end() && p->detid==detid)
    return ((p->BadApvs>>apvNb)&0x1);
  return false;
}
bool SiStripQuality::IsFiberBad ( const uint32_t &  detid,
const short &  fiberNb 
) const

Definition at line 601 of file SiStripQuality.cc.

References BadComponentVect, cond::rpcobgas::detid, and AlCaHLTBitMon_ParallelJobs::p.

{
  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
  if (p!=BadComponentVect.end() && p->detid==detid)
    return ((p->BadFibers>>fiberNb)&0x1);
  return false;
}
bool SiStripQuality::IsModuleBad ( const uint32_t &  detid) const

Definition at line 593 of file SiStripQuality.cc.

References BadComponentVect, cond::rpcobgas::detid, and AlCaHLTBitMon_ParallelJobs::p.

{
  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
  if (p!=BadComponentVect.end() && p->detid==detid)
    return p->BadModule;
  return false;
}
bool SiStripQuality::IsModuleUsable ( const uint32_t &  detid) const

Definition at line 579 of file SiStripQuality.cc.

References BadComponentVect, cond::rpcobgas::detid, SiStripDetCabling::IsConnected(), NULL, AlCaHLTBitMon_ParallelJobs::p, and SiStripDetCabling_.

Referenced by StMeasurementDetSet::initializeStripStatus().

{
  std::vector<BadComponent>::const_iterator p = std::lower_bound(BadComponentVect.begin(),BadComponentVect.end(),detid,SiStripQuality::BadComponentStrictWeakOrdering());
  if (p!=BadComponentVect.end() && p->detid==detid)
    if(p->BadModule)
      return false;

  if (SiStripDetCabling_!=NULL)
    if(!SiStripDetCabling_->IsConnected(detid))
      return false;

  return true;
}
bool SiStripQuality::IsStripBad ( const Range range,
const short &  strip 
) const

Definition at line 623 of file SiStripQuality.cc.

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

{
  bool result=false;
  SiStripBadStrip::data fs;
  for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
    fs=decode(*it);
    if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
      result=true;
      break;
    }      
  }
  return result;
}
bool SiStripQuality::IsStripBad ( const uint32_t &  detid,
const short &  strip 
) const
int SiStripQuality::nBadStripsOnTheLeft ( const Range range,
const short &  strip 
) const

Definition at line 637 of file SiStripQuality.cc.

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

{
  int result=0;
  SiStripBadStrip::data fs;
  for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
    fs=decode(*it);
    if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
      result=strip-fs.firstStrip+1;
      break;
    }      
  }
  return result;
}
int SiStripQuality::nBadStripsOnTheRight ( const Range range,
const short &  strip 
) const

Definition at line 651 of file SiStripQuality.cc.

References SiStripBadStrip::decode(), SiStripBadStrip::data::firstStrip, SiStripBadStrip::data::range, query::result, and strip().

{
  int result=0;
  SiStripBadStrip::data fs;
  for(SiStripBadStrip::ContainerIterator it=range.first;it!=range.second;++it){
    fs=decode(*it);
    if ( fs.firstStrip<=strip && strip<fs.firstStrip+fs.range ){
      result=fs.firstStrip+fs.range-strip;
      break;
    }      
  }
  return result;
}
bool SiStripQuality::operator!= ( const SiStripQuality other) const

Definition at line 110 of file SiStripQuality.cc.

{ return !(*this == other) ; }
SiStripQuality & SiStripQuality::operator+= ( const SiStripQuality other)

Definition at line 49 of file SiStripQuality.cc.

References add(), cleanUp(), and fillBadComponents().

{
  this->add(&other); 
  this->cleanUp(); 
  this->fillBadComponents(); 
  return *this; 
}
const SiStripQuality SiStripQuality::operator- ( const SiStripQuality other) const

Definition at line 99 of file SiStripQuality.cc.

References SiStripQuality().

{
  return SiStripQuality(*this) -= other; 
}
SiStripQuality & SiStripQuality::operator-= ( const SiStripQuality other)

Definition at line 57 of file SiStripQuality.cc.

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

{    
  SiStripBadStrip::RegistryIterator rbegin = other.getRegistryVectorBegin();
  SiStripBadStrip::RegistryIterator rend   = other.getRegistryVectorEnd();
  std::vector<unsigned int> ovect,vect;
  uint32_t detid;
  unsigned short Nstrips;
    
  for (SiStripBadStrip::RegistryIterator rp=rbegin; rp != rend; ++rp) {
    
    detid=rp->detid;
    Nstrips=reader->getNumberOfApvsAndStripLength(detid).first*128;
    
    SiStripBadStrip::Range orange = SiStripBadStrip::Range( other.getDataVectorBegin()+rp->ibegin , other.getDataVectorBegin()+rp->iend );
    
    //Is this detid already in the collections owned by this class?
    SiStripBadStrip::Range range = getRange(detid);   
    if (range.first!=range.second){ //yes, it is

      vect.clear();
      ovect.clear();

      //if other full det is bad, remove det from this
      SiStripBadStrip::data data_=decode(*(orange.first));
      if(orange.second-orange.first!=1
         || data_.firstStrip!=0
         || data_.range<Nstrips){
        
        ovect.insert(ovect.end(),orange.first,orange.second);
        vect.insert(vect.end(),range.first,range.second);
        subtract(vect,ovect);
      } 
      SiStripBadStrip::Range newrange(vect.begin(),vect.end());
      if ( ! put_replace(detid,newrange) )
        edm::LogError("SiStripQuality")<<"[" << __PRETTY_FUNCTION__ << "] " << std::endl;
    }
  }
  cleanUp(); 
  fillBadComponents(); 
  return *this; 
}
bool SiStripQuality::operator== ( const SiStripQuality other) const
void SiStripQuality::printActiveFedsInfo ( const std::vector< uint16_t > &  activeFedsFromCabling,
const std::vector< int > &  activeFedsFromRunInfo,
const std::vector< int > &  differentFeds,
const bool  printDebug 
) [private]

Prints debug output for the active feds comparing the list in RunInfo and FedCabling.

Definition at line 726 of file SiStripQuality.cc.

References filterCSVwithJSON::copy.

Referenced by add().

{
  std::ostringstream ss;

  if( printDebug ) {
    ss << "activeFedsFromCabling:" << std::endl;
    std::copy(activeFedsFromCabling.begin(), activeFedsFromCabling.end(), std::ostream_iterator<uint16_t>(ss, " "));
    ss << std::endl;
    ss << "activeFedsFromRunInfo:" << std::endl;
    std::copy(activeFedsFromRunInfo.begin(), activeFedsFromRunInfo.end(), std::ostream_iterator<int>(ss, " "));
    ss << std::endl;
  }
  if( differentFeds.size() != 440 ) {
    ss << "differentFeds : " << std::endl;
    std::copy(differentFeds.begin(), differentFeds.end(), std::ostream_iterator<int>(ss, " "));
    ss << std::endl;
  }
  else {
    ss << "There are 440 feds (all) active for Cabling but off for RunInfo. Tracker was probably not in this run" << std::endl;
  }
  edm::LogInfo("SiStripQuality") << ss.str() << std::endl;
}
void SiStripQuality::printDetInfo ( const uint32_t &  detId,
const uint32_t &  apvPairNumber,
std::stringstream &  ss 
) [private]

Prints debug output for a given detId.

Definition at line 681 of file SiStripQuality.cc.

References cond::rpcobgas::detid, TIBDetId::layer(), TOBDetId::layer(), DetId::rawId(), DetId::subdetId(), StripSubdetector::TEC, StripSubdetector::TIB, StripSubdetector::TID, StripSubdetector::TOB, and TECDetId::wheel().

Referenced by turnOffFeds().

{
  int layer = 0;
  int stereo = 0;
  std::string subDetName;
  DetId detid(detId);
  switch (detid.subdetId()) {
  case StripSubdetector::TIB:
    {
      TIBDetId theTIBDetId(detid.rawId());
      layer = theTIBDetId.layer();
      stereo = theTIBDetId.stereo();
      subDetName = "TIB";
      break;
    }
  case StripSubdetector::TOB:
    {
      TOBDetId theTOBDetId(detid.rawId());
      layer = theTOBDetId.layer();
      stereo = theTOBDetId.stereo();
      subDetName = "TOB";
      break;
    }
  case StripSubdetector::TEC:
    {
      TECDetId theTECDetId(detid.rawId());
      // is this module in TEC+ or TEC-?
      layer = theTECDetId.wheel();
      stereo = theTECDetId.stereo();
      subDetName = "TEC";
      break;
    }
  case StripSubdetector::TID:
    {
      TECDetId theTIDDetId(detid.rawId());
      // is this module in TID+ or TID-?
      layer = theTIDDetId.wheel();
      stereo = theTIDDetId.stereo();
      subDetName = "TID";
      break;
    }
  }
  ss << detId << " and apv = " << apvPairNumber << " of subDet = " << subDetName << ", layer = " << layer << " stereo = " << stereo << std::endl;
}
bool SiStripQuality::put_replace ( const uint32_t &  DetId,
Range  input 
) [private]

Definition at line 335 of file SiStripQuality.cc.

References SiStripBadStrip::DetRegistry::detid, SiStripBadStrip::DetRegistry::ibegin, SiStripBadStrip::DetRegistry::iend, SiStripBadStrip::indexes, LogTrace, AlCaHLTBitMon_ParallelJobs::p, sd, toCleanUp, and SiStripBadStrip::v_badstrips.

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

{
  // put in SiStripQuality::v_badstrips of DetId
  Registry::iterator p = std::lower_bound(indexes.begin(),indexes.end(),DetId,SiStripBadStrip::StrictWeakOrdering());

  size_t sd= input.second-input.first;
  DetRegistry detregistry;
  detregistry.detid=DetId;
  detregistry.ibegin=v_badstrips.size();
  detregistry.iend=v_badstrips.size()+sd;

  v_badstrips.insert(v_badstrips.end(),input.first,input.second);

  if (p!=indexes.end() && p->detid==DetId){
    LogTrace("SiStripQuality") << "[SiStripQuality::put_replace]  Replacing SiStripQuality for already stored DetID " << DetId << std::endl;
    toCleanUp=true;
    *p=detregistry;
  } else {
    indexes.insert(p,detregistry);
  }

  return true;
}
void SiStripQuality::ReduceGranularity ( double  threshold)

Definition at line 365 of file SiStripQuality.cc.

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

{
  SiStripBadStrip::RegistryIterator rp = getRegistryVectorBegin();
  SiStripBadStrip::RegistryIterator rend   = getRegistryVectorEnd();
  SiStripBadStrip::data data_;
  uint16_t BadStripPerApv[6], ipos;
  std::vector<unsigned int> vect;

  for (; rp != rend; ++rp) {
    uint32_t detid=rp->detid;

    BadStripPerApv[0]=0;    BadStripPerApv[1]=0;    BadStripPerApv[2]=0;    BadStripPerApv[3]=0;    BadStripPerApv[4]=0;    BadStripPerApv[5]=0;
    ipos=0;

    SiStripBadStrip::Range sqrange = SiStripBadStrip::Range( getDataVectorBegin()+rp->ibegin , getDataVectorBegin()+rp->iend );
    
    for(int it=0;it<sqrange.second-sqrange.first;it++){

      data_=decode( *(sqrange.first+it) );
      LogTrace("SiStripQuality") << "[SiStripQuality::ReduceGranularity] detid " << detid << " first strip " << data_.firstStrip << " lastStrip " << data_.firstStrip+data_.range-1  << " range " << data_.range;
      ipos= data_.firstStrip/128;
      while (ipos<=(data_.firstStrip+data_.range-1)/128){
        BadStripPerApv[ipos]+=std::min(data_.firstStrip+data_.range,(ipos+1)*128)-std::max(data_.firstStrip*1,ipos*128);
        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);
        ipos++;
      }
    }

    LogTrace("SiStripQuality") << "[SiStripQuality::ReduceGranularity] Total for detid " << detid << " values " << BadStripPerApv[0] << " " << BadStripPerApv[1] << " " << BadStripPerApv[2] << " " <<BadStripPerApv[3] << " " <<BadStripPerApv[4] << " " << BadStripPerApv[5];
    
    
    vect.clear();
    for(size_t i=0;i<6;++i){
      if (BadStripPerApv[i]>=threshold*128){
        vect.push_back(encode(i*128,128));
      }
    }
    if(!vect.empty()){
      SiStripBadStrip::Range Range(vect.begin(),vect.end());
      add(detid,Range);
    }
  }
}
void SiStripQuality::setPrintDebugOutput ( const bool  printDebug) [inline]

Definition at line 125 of file SiStripQuality.h.

References SiStripBadStrip::printDebug(), and printDebug_.

void SiStripQuality::setUseEmptyRunInfo ( const bool  useEmptyRunInfo) [inline]

Definition at line 126 of file SiStripQuality.h.

References useEmptyRunInfo_.

{ useEmptyRunInfo_ = useEmptyRunInfo; }
void SiStripQuality::subtract ( std::vector< unsigned int > &  A,
const std::vector< unsigned int > &  B 
) [private]

Definition at line 449 of file SiStripQuality.cc.

References subtraction().

Referenced by operator-=().

{
  ContainerIterator it=B.begin();
  ContainerIterator itend=B.end();
  for(;it!=itend;++it){    
    subtraction(A,*it);
  }
}
void SiStripQuality::subtraction ( std::vector< unsigned int > &  A,
const unsigned int &  B 
) [private]

Definition at line 458 of file SiStripQuality.cc.

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

Referenced by subtract().

{
  SiStripBadStrip::data fs_A, fs_B, fs_m, fs_M;
  std::vector<unsigned int> tmp;

  fs_B=decode(B);
  ContainerIterator jt=A.begin();
  ContainerIterator jtend=A.end();
  for(;jt!=jtend;++jt){
    fs_A=decode(*jt);
    if (B<*jt){
      fs_m=fs_B;
      fs_M=fs_A;
    }else{
      fs_m=fs_A;
      fs_M=fs_B;
    }
    //A) Verify the range to be subtracted crosses the new range
    if (fs_m.firstStrip+fs_m.range>fs_M.firstStrip){
      if (*jt<B){
        tmp.push_back(encode(fs_A.firstStrip,fs_B.firstStrip-fs_A.firstStrip));
      }
      if (fs_A.firstStrip+fs_A.range>fs_B.firstStrip+fs_B.range){
        tmp.push_back(encode(fs_B.firstStrip+fs_B.range,fs_A.firstStrip+fs_A.range-(fs_B.firstStrip+fs_B.range)));
      }
    }else{
      tmp.push_back(*jt);
    }
  } 
  A=tmp;
}
void SiStripQuality::turnOffFeds ( const std::vector< int > &  fedsList,
const bool  turnOffStrips,
const bool  printDebug 
) [private]

Loop on all the fedIds, take the fedChannels and then the detId. Depending on the value of a bool turn off or not the strips in the list.

Definition at line 752 of file SiStripQuality.cc.

References add(), SiStripFedCabling::connections(), SiStripBadStrip::encode(), SiStripDetCabling::fedCabling(), LogTrace, printDetInfo(), and SiStripDetCabling_.

Referenced by add().

{

  std::stringstream ss;
  if( printDebug ) {
    ss << "associated to detIds : " << std::endl;
  }

  std::vector<int>::const_iterator fedIdIt = fedsList.begin();
  for( ; fedIdIt != fedsList.end(); ++fedIdIt ) {
    std::vector<FedChannelConnection>::const_iterator fedChIt = SiStripDetCabling_->fedCabling()->connections( *fedIdIt ).begin();
    for( ; fedChIt != SiStripDetCabling_->fedCabling()->connections( *fedIdIt ).end(); ++fedChIt ) {
      uint32_t detId = fedChIt->detId();
      if (detId == 0 || detId == 0xFFFFFFFF) continue;
      uint16_t apvPairNumber = fedChIt->apvPairNumber();

      if( printDebug ) {
        printDetInfo(detId, apvPairNumber, ss);
      }

      if( turnOffStrips ) {
        // apvPairNumber == i it means that the i*256 strips are to be set off
        std::vector<unsigned int> vect;
        vect.push_back(encode(apvPairNumber*256,256));
        SiStripBadStrip::Range Range(vect.begin(), vect.end());
        add(detId,Range);
        LogTrace("SiStripQuality") << "[addOffForRunInfo] adding apvPairNumber "<<apvPairNumber<<" for detId "<<detId<<" off according to RunInfo" << std::endl;
      }
    }
  }
  if( printDebug ) {
    edm::LogInfo("SiStripQuality") << ss.str() << std::endl;
  }
}

Member Data Documentation

Definition at line 150 of file SiStripQuality.h.

Referenced by getFileInPath(), and SiStripQuality().

Definition at line 156 of file SiStripQuality.h.

Referenced by add(), setPrintDebugOutput(), and SiStripQuality().

bool SiStripQuality::toCleanUp [private]

Definition at line 149 of file SiStripQuality.h.

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

Definition at line 157 of file SiStripQuality.h.

Referenced by add(), setUseEmptyRunInfo(), and SiStripQuality().