CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

SiStripDelay Class Reference

#include <SiStripDelay.h>

List of all members.

Public Member Functions

void clear ()
 Empty all the containers.
void fillNewDelay (const SiStripBaseDelay &baseDelay, const int sumSign, const std::pair< std::string, std::string > &recordLabelPair)
const SiStripBaseDelaygetBaseDelay (const uint32_t index) const
float getDelay (const uint32_t detId) const
 Return the delay combining all the baseDelays.
std::string getLabelName (const uint32_t index) const
size_t getNumberOfTags () const
std::string getRcdName (const uint32_t index) const
int getTagSign (const uint32_t index) const
bool makeDelay ()
 Builds the boost::unordered_map.
void printDebug (std::stringstream &ss) const
 Prints the delays for all the detIds.
void printSummary (std::stringstream &ss) const
 Prints the average value of the delays for all layers and wheels in the SiStripTracker.
 SiStripDelay (const SiStripBaseDelay &baseDelay, const int sumSign, const std::pair< std::string, std::string > &recordLabelPair)
 SiStripDelay ()
virtual ~SiStripDelay ()

Private Member Functions

const SiStripDelayoperator= (const SiStripDelay &)
 SiStripDelay (const SiStripDelay &)

Private Attributes

std::vector< const
SiStripBaseDelay * > 
baseDelayVector_
boost::unordered_map< uint32_t,
double > 
delays_
std::vector< std::pair
< std::string, std::string > > 
recordLabelPair_
std::vector< int > sumSignVector_

Detailed Description

Author: M. De Mattia (demattia@pd.infn.it) 25/10/2010:

Dependent record used to combine the SiStripBaseDelays and provide the reconstruction with a single delay value.
When the object is built the list of values is stored in boost::unordered_map which, for the number of modules in the Tracker (~15000) resulted much faster (more than a factor 2) than a std::map or a lower_bound search in a sorted vector.
The base delays must be filled in together with the sign they will get in the summation: baseDelay1*sign1 + baseDelay2*sign2 + ...
Pointers to the baseDelays are stored and after the fill is complete the method "makeDelay" must be called to build the internal map.
This additional step is required such that we don't build the map anytime a new baseDelay is inserted and we don't make checks anytime the getDelay method is called.
NOTE: Even if the code does not rely on the presence of the same detIds in all the baseDelays, this condition should be fullfilled for consistency. The code checks only that the number of detIds is the same in all baseDelays.

Definition at line 32 of file SiStripDelay.h.


Constructor & Destructor Documentation

SiStripDelay::SiStripDelay ( ) [inline]

Definition at line 35 of file SiStripDelay.h.

{};
virtual SiStripDelay::~SiStripDelay ( ) [inline, virtual]

Definition at line 36 of file SiStripDelay.h.

{};
SiStripDelay::SiStripDelay ( const SiStripBaseDelay baseDelay,
const int  sumSign,
const std::pair< std::string, std::string > &  recordLabelPair 
) [inline]

Definition at line 38 of file SiStripDelay.h.

References fillNewDelay().

  {
    fillNewDelay(baseDelay, sumSign, recordLabelPair);
  }
SiStripDelay::SiStripDelay ( const SiStripDelay ) [private]

Member Function Documentation

void SiStripDelay::clear ( void  )

Empty all the containers.

Definition at line 110 of file SiStripDelay.cc.

References baseDelayVector_, delays_, recordLabelPair_, and sumSignVector_.

{
  baseDelayVector_.clear();
  sumSignVector_.clear();
  recordLabelPair_.clear();
  delays_.clear();
}
void SiStripDelay::fillNewDelay ( const SiStripBaseDelay baseDelay,
const int  sumSign,
const std::pair< std::string, std::string > &  recordLabelPair 
)

Definition at line 19 of file SiStripDelay.cc.

References baseDelayVector_, recordLabelPair_, and sumSignVector_.

Referenced by SiStripDelay().

{
  baseDelayVector_.push_back(&baseDelay);
  sumSignVector_.push_back(sumSign);
  recordLabelPair_.push_back(recordLabelPair);
}
const SiStripBaseDelay* SiStripDelay::getBaseDelay ( const uint32_t  index) const [inline]

The second parameter allows to specify which delay to retrieve, considering that they are in input order. NOTE that no protection is inside the method (because we want to keep it very light) therefore it is the caller duty to check that the index is in the correct range.

Definition at line 62 of file SiStripDelay.h.

References baseDelayVector_, and getHLTprescales::index.

  {
    return baseDelayVector_[index];
  }
float SiStripDelay::getDelay ( const uint32_t  detId) const

Return the delay combining all the baseDelays.

Definition at line 27 of file SiStripDelay.cc.

References delays_.

{
  boost::unordered_map<uint32_t, double>::const_iterator it = delays_.find(detId);
  if( it != delays_.end() ) {
    return it->second;
  }
  return 0.;
}
std::string SiStripDelay::getLabelName ( const uint32_t  index) const [inline]

Definition at line 75 of file SiStripDelay.h.

References getHLTprescales::index, and recordLabelPair_.

  {
    return recordLabelPair_[index].second;
  }
size_t SiStripDelay::getNumberOfTags ( ) const [inline]

Definition at line 67 of file SiStripDelay.h.

References baseDelayVector_.

  {
    return baseDelayVector_.size();
  }
std::string SiStripDelay::getRcdName ( const uint32_t  index) const [inline]

Definition at line 71 of file SiStripDelay.h.

References getHLTprescales::index, and recordLabelPair_.

  {
    return recordLabelPair_[index].first;
  }
int SiStripDelay::getTagSign ( const uint32_t  index) const [inline]

Definition at line 79 of file SiStripDelay.h.

References getHLTprescales::index, and sumSignVector_.

  {
    return sumSignVector_[index];
  }
bool SiStripDelay::makeDelay ( )

Builds the boost::unordered_map.

Definition at line 36 of file SiStripDelay.cc.

References baseDelayVector_, gather_cfg::cout, delays_, and sumSignVector_.

{
  if( baseDelayVector_.empty() ) {
    return false;
  }
  std::vector<const SiStripBaseDelay*>::const_iterator it = baseDelayVector_.begin();
  // Check for consistent size in all baseDelays
  if( baseDelayVector_.size() > 1 ) {
    for( ; it != baseDelayVector_.end()-1; ++it ) {
      if( (*it)->delaysSize() != (*(it+1))->delaysSize() ) {
        std::cout << "makeDelay: Error, size of base delays is different!!" << std::endl;
        return false;
      }
    }
  }
  
//   // All checks done, fill the boost::unoredered_map with the first one (initialization)
//   int sumSignIndex = 0;
//   int sumSign = 0;
//   std::vector<uint32_t>::const_iterator detIdIt;
//   for( it = baseDelayVector_.begin(); it != baseDelayVector_.end(); ++it, ++sumSignIndex ) {
//     std::vector<uint32_t> detIds;
//     (*it)->detIds(detIds);
//     sumSign = sumSignVector_[sumSignIndex];
//     for( detIdIt = detIds.begin(); detIdIt != detIds.end(); ++detIdIt ) {
//       // Check if is alread there so that we never rely on the default initialization
//       boost::unordered_map<uint32_t, double>::iterator delayIt = delays_.find(*detIdIt);
//       if( delayIt != delays_.end() ) {
//      std::cout << "second delay = " << (*it)->delay(*detIdIt)*sumSign << std::endl;
//      delays_[*detIdIt] += (*it)->delay(*detIdIt)*sumSign;
//      std::cout << "Full delay = " << delays_[*detIdIt] << std::endl;
//       }
//       else {
//      std::cout << "first delay = " << (*it)->delay(*detIdIt)*sumSign << std::endl;
//      delays_[*detIdIt] = (*it)->delay(*detIdIt)*sumSign;
//       }
//     }
//   }

  // All checks done, fill the boost::unoredered_map with the first one (initialization)
  int sumSignIndex = 0;
  int sumSign = sumSignVector_[sumSignIndex];
  it = baseDelayVector_.begin();
  std::vector<uint32_t> detIds;
  (*it)->detIds(detIds);
  std::vector<uint32_t>::const_iterator detIdIt = detIds.begin();
  for( ; detIdIt != detIds.end(); ++detIdIt ) {
    delays_[*detIdIt] = (*it)->delay(*detIdIt)*sumSign;
  }
  ++it;
  ++sumSignIndex;
  // Fill all the others
  for( ; it != baseDelayVector_.end(); ++it, ++sumSignIndex ) {
    std::vector<uint32_t> detIds;
    (*it)->detIds(detIds);
    detIdIt = detIds.begin();
    sumSign = sumSignVector_[sumSignIndex];
    for( ; detIdIt != detIds.end(); ++detIdIt ) {
      // The same detIds should be in both maps, if not don't rely on the default initialization
      boost::unordered_map<uint32_t, double>::iterator delayIt = delays_.find(*detIdIt);
      if( delayIt != delays_.end() ) {
        delays_[*detIdIt] += (*it)->delay(*detIdIt)*sumSign;
      }
      else {
        std::cout << "makeDelay: Warning, detId = " << *detIdIt << " not present, summing to 0..." << std::cout;
        std::cout << "This means that the two baseDelay tags have different detIds. PLEASE, CHECK THAT THIS IS EXPECTED." << std::cout;
        delays_[*detIdIt] = (*it)->delay(*detIdIt)*sumSign;
      }
    }
  }

  return true;
}
const SiStripDelay& SiStripDelay::operator= ( const SiStripDelay ) [private]
void SiStripDelay::printDebug ( std::stringstream &  ss) const

Prints the delays for all the detIds.

Definition at line 118 of file SiStripDelay.cc.

References delays_.

{
  boost::unordered_map<uint32_t, double>::const_iterator it = delays_.begin();
  for( ; it != delays_.end(); ++it ) {
    ss << "detId = " << it->first << " delay = " << it->second << std::endl;
  }
}
void SiStripDelay::printSummary ( std::stringstream &  ss) const

Prints the average value of the delays for all layers and wheels in the SiStripTracker.

Definition at line 126 of file SiStripDelay.cc.

References SiStripDetSummary::add(), delays_, and SiStripDetSummary::print().

{
  SiStripDetSummary summaryDelays;
  boost::unordered_map<uint32_t, double>::const_iterator it = delays_.begin();
  for( ; it != delays_.end(); ++it ) {
    summaryDelays.add(it->first, it->second);
  }
  summaryDelays.print(ss);
}

Member Data Documentation

std::vector<const SiStripBaseDelay *> SiStripDelay::baseDelayVector_ [private]

Definition at line 96 of file SiStripDelay.h.

Referenced by clear(), fillNewDelay(), getBaseDelay(), getNumberOfTags(), and makeDelay().

boost::unordered_map<uint32_t, double> SiStripDelay::delays_ [private]

Definition at line 99 of file SiStripDelay.h.

Referenced by clear(), getDelay(), makeDelay(), printDebug(), and printSummary().

std::vector<std::pair<std::string, std::string> > SiStripDelay::recordLabelPair_ [private]

Definition at line 98 of file SiStripDelay.h.

Referenced by clear(), fillNewDelay(), getLabelName(), and getRcdName().

std::vector<int> SiStripDelay::sumSignVector_ [private]

Definition at line 97 of file SiStripDelay.h.

Referenced by clear(), fillNewDelay(), getTagSign(), and makeDelay().