CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

NoiseTask Class Reference

#include <NoiseTask.h>

Inheritance diagram for NoiseTask:
CommissioningTask

List of all members.

Public Member Functions

 NoiseTask (DQMStore *, const FedChannelConnection &)
virtual ~NoiseTask ()

Private Member Functions

virtual void book ()
virtual void fill (const SiStripEventSummary &, const edm::DetSet< SiStripRawDigi > &)
virtual void update ()

Private Attributes

std::vector< HistoSetcm_
ApvAnalysisFactorypApvFactory_
std::vector< HistoSetpeds_

Detailed Description

Definition at line 19 of file NoiseTask.h.


Constructor & Destructor Documentation

NoiseTask::NoiseTask ( DQMStore dqm,
const FedChannelConnection conn 
)

Definition at line 37 of file NoiseTask.cc.

References LogTrace, sistrip::mlDqmSource_, cmsCodeRules::cppFunctionSkipper::operator, and pApvFactory_.

  : CommissioningTask( dqm, conn, "NoiseTask")
{
  //@@ NOT GUARANTEED TO BE THREAD SAFE! 
  pApvFactory_ = edm::Service<ApvFactoryService>().operator->()->getApvFactory();
  
  LogTrace( mlDqmSource_)
    << "[NoiseTask::" << __func__ << "]"
    << " Constructing object...";
}
NoiseTask::~NoiseTask ( ) [virtual]

Definition at line 51 of file NoiseTask.cc.

References LogTrace, sistrip::mlDqmSource_, and pApvFactory_.

{
  LogTrace(mlDqmSource_)
    << "[NoiseTask::" << __func__ << "]"
    << " Destructing object...";

  // Have to delete pApvFactory_ manually even though we didn't create it
  // ourself. :(
  if( pApvFactory_) { delete pApvFactory_; } 
}

Member Function Documentation

void NoiseTask::book ( ) [private, virtual]

Reimplemented from CommissioningTask.

Definition at line 64 of file NoiseTask.cc.

References sistrip::APV, FedChannelConnection::apvPairNumber(), cm_, sistrip::extrainfo::commonMode_, CommissioningTask::connection(), FedChannelConnection::detId(), CommissioningTask::dqm(), CommissioningTask::eventSetup(), sistrip::EXPERT_HISTO, sistrip::FED_KEY, CommissioningTask::fedKey(), edm::EventSetup::get(), ApvAnalysisFactory::getApvAnalysis(), CommissioningTask::HistoSet::histo(), ApvAnalysisFactory::instantiateApvs(), CommissioningTask::HistoSet::isProfile_, sistrip::LLD_CHAN, LogTrace, sistrip::mlDqmSource_, sistrip::NOISE, sistrip::extrainfo::noise_, pApvFactory_, sistrip::PEDESTALS, sistrip::extrainfo::pedestals_, peds_, SiStripHistoTitle::title(), indexGen::title, CommissioningTask::HistoSet::vNumOfEntries_, CommissioningTask::HistoSet::vSumOfContents_, and CommissioningTask::HistoSet::vSumOfSquares_.

{
  LogTrace( mlDqmSource_) << "[NoiseTask::" << __func__ << "]";

  // CACHING
  static std::auto_ptr<SiStripPedestals> pDBPedestals;
  static std::auto_ptr<SiStripNoises>    pDBNoises;
  
  const uint16_t nBINS = 256;
  
  {
    // Pedestals
    std::string title = SiStripHistoTitle( sistrip::EXPERT_HISTO,
                                           sistrip::NOISE,
                                           sistrip::FED_KEY,
                                           fedKey(),
                                           sistrip::LLD_CHAN,
                                           connection().lldChannel(),
                                           sistrip::extrainfo::pedestals_).title();

    HistoSet oHSet;
    oHSet.isProfile_ = true;

    oHSet.vNumOfEntries_.resize( nBINS, 0);
    oHSet.vSumOfContents_.resize( nBINS, 0);
    oHSet.vSumOfSquares_.resize( nBINS, 0);

    oHSet.histo( dqm()->bookProfile( title, title,
                                     nBINS, -0.5, nBINS * 1. - 0.5,
                                     1025, 0., 1025.) );

    peds_.push_back( oHSet);
  }

  {
    // Corrected Noise
    std::string title = SiStripHistoTitle( sistrip::EXPERT_HISTO,
                                           sistrip::NOISE,
                                           sistrip::FED_KEY,
                                           fedKey(),
                                           sistrip::LLD_CHAN,
                                           connection().lldChannel(),
                                           sistrip::extrainfo::noise_).title();

    HistoSet oHSet;
    oHSet.isProfile_ = true;

    oHSet.vNumOfEntries_.resize( nBINS, 0);
    oHSet.vSumOfContents_.resize( nBINS, 0);
    oHSet.vSumOfSquares_.resize( nBINS, 0);

    oHSet.histo( dqm()->bookProfile( title, title,
                                     nBINS, -0.5, nBINS * 1. - 0.5,
                                     1025, 0., 1025.) );

    peds_.push_back( oHSet);
  }

  const uint16_t nCM_BINS = 1024;
  for( uint16_t nApv = 0; 2 > nApv; ++nApv)
    {
      std::string title = SiStripHistoTitle( sistrip::EXPERT_HISTO,
                                             sistrip::PEDESTALS,
                                             sistrip::FED_KEY,
                                             fedKey(),
                                             sistrip::APV,
                                             connection().i2cAddr( nApv),
                                             sistrip::extrainfo::commonMode_).title();

      HistoSet oHSet;

      oHSet.isProfile_ = false;

      oHSet.vNumOfEntries_.resize( nCM_BINS, 0);

      oHSet.histo( dqm()->book1D( title, title, 
                                  nCM_BINS, 
                                  nCM_BINS/2 * -1. - 0.5, 
                                  nCM_BINS/2 *  1. - 0.5 ) );
    
      cm_.push_back( oHSet);
    }
  
  // Initialize Apv
  pApvFactory_->instantiateApvs( connection().detId(), connection().nApvs() );

  // --[ RETRIEVE PEDESTALS FROM DB ]--
  // Operation should be performed only once
  if( !pDBPedestals.get()) {
    LogTrace( mlDqmSource_)
      << "[NoiseTask::" << __func__ << "] "
      << "Retrieving Pedestals from DB";

    // Directly retrieve Pedestals from EventSetup
    edm::ESHandle<SiStripPedestals> pedestals;
    eventSetup()->get<SiStripPedestalsRcd>().get( pedestals);

    // Cache Pedestals
    pDBPedestals.reset( new SiStripPedestals( *pedestals) );

    LogTrace( mlDqmSource_)
      << "[NoiseTask::" << __func__ << "] "
      << "Done Retrieving Pedestals from DB";
  } // End retrieve Pedestals from DB

  // --[ RETRIEVE NOISES FROM DB ]--
  // Operation should be performed only once
  if( !pDBNoises.get()) {
    LogTrace( mlDqmSource_)
      << "[NoiseTask::" << __func__ << "] "
      << "Retrieving Noises from DB";

    // Directly retrieve Noises from EventSetup
    edm::ESHandle<SiStripNoises> noises;
    eventSetup()->get<SiStripNoisesRcd>().get( noises);

    // Cache Pedestals
    pDBNoises.reset( new SiStripNoises( *noises) );

    LogTrace( mlDqmSource_)
      << "[NoiseTask::" << __func__ << "] "
      << "Done Retrieving Noises from DB";
  } // End retrieve Noises from DB


  // Get ApvAnalysis associated with given DetId
  ApvAnalysisFactory::ApvAnalysisVector 
    apvAnalysisVector( pApvFactory_->getApvAnalysis( connection().detId()));

  SiStripPedestals::Range pedestalsRange( 
                                         pDBPedestals->getRange( connection().detId() ) );
  SiStripNoises::Range noisesRange( 
                                   pDBNoises->getRange( connection().detId() ) );

  // Cache Apv Pair #
  const uint16_t nAPV_PAIR = connection().apvPairNumber();

  for( uint16_t nLclApv = 0; 2 > nLclApv; ++nLclApv) {
    // Retrieve pedestals and noises associated with given DetId/Apv
    ApvAnalysis::PedestalType pedestals; 
    ApvAnalysis::PedestalType noises;
    for( uint16_t nStrip = nAPV_PAIR * 256 + nLclApv * 128, 
           nMaxStrip = nStrip + 128; 
         nMaxStrip > nStrip; 
         ++nStrip) 
      {
        pedestals.push_back( pDBPedestals->getPed( nStrip, pedestalsRange));
        noises.push_back( pDBNoises->getNoise( nStrip, noisesRange));
      }

    try {
      // Checked access
      ApvAnalysisFactory::ApvAnalysisVector::reference rApvAnalysis =
        apvAnalysisVector.at( nAPV_PAIR * 2 + nLclApv);

      rApvAnalysis->pedestalCalculator().setPedestals( pedestals);
      rApvAnalysis->pedestalCalculator().setNoise( noises);

      /*
        std::stringstream out;
        LogTrace( mlDqmSource_)
        << "[NoiseTask::" << __func__ << "] "
        << "DetId|Apv# -> " 
        << connection().detId() << '|' << ( nAPV_PAIR * 2 + nLclApv)
        << "   Pedestals: " 
        << ( out << pedestals 
        << "   Noises: " << noises, out.str());
      */
    } catch( std::out_of_range) {
      // Hmm, didn't find appropriate Apv :((( -> VERY, VERY BAD
      LogTrace( mlDqmSource_)
        << "[NoiseTask::" << __func__ << "] "
        << "Could not set Pedestals/Noises for DetId|Apv# -> " 
        << connection().detId() << '|' << ( nAPV_PAIR * 2 + nLclApv)
        << ". !!! POSSIBLE BUG !!!";
    } // End Try block
  } // End Local Apvs loop
}
void NoiseTask::fill ( const SiStripEventSummary rSummary,
const edm::DetSet< SiStripRawDigi > &  rDigis 
) [private, virtual]

Reimplemented from CommissioningTask.

Definition at line 245 of file NoiseTask.cc.

References CommissioningTask::connection(), pApvFactory_, and ApvAnalysisFactory::updatePair().

{
  pApvFactory_->updatePair( connection().detId(), 
                            connection().apvPairNumber(), 
                            rDigis);
}
void NoiseTask::update ( void  ) [private, virtual]

Reimplemented from CommissioningTask.

Definition at line 255 of file NoiseTask.cc.

References FedChannelConnection::apvPairNumber(), cm_, CommissioningTask::connection(), FedChannelConnection::detId(), extract(), ApvAnalysisFactory::getCommonMode(), ApvAnalysisFactory::getNoise(), ApvAnalysisFactory::getPedestal(), trackerHits::histo, LogTrace, sistrip::mlDqmSource_, dbtoconf::out, pApvFactory_, peds_, UpdateTProfile::setBinContent(), and CommissioningTask::updateHistoSet().

{
  static UpdateTProfile updateTProfile;

  TProfile *pedsProf  = ExtractTObject<TProfile>().extract( peds_[0].histo() );
  TProfile *noiseProf = ExtractTObject<TProfile>().extract( peds_[1].histo() );

  for( uint16_t nLclApv = 2 * connection().apvPairNumber(),
         nMaxLclApv = nLclApv + 2,
         nApv = 0;
       nMaxLclApv > nLclApv;
       ++nLclApv, ++nApv)
    {
      ApvAnalysis::PedestalType lclPedestals;
      ApvAnalysis::PedestalType lclNoises;
      ApvAnalysis::PedestalType lclCommonMode( 
                                              pApvFactory_->getCommonMode( connection().detId(), nLclApv) );

      pApvFactory_->getPedestal  ( connection().detId(), nLclApv, lclPedestals);
      pApvFactory_->getNoise     ( connection().detId(), nLclApv, lclNoises );

      const uint16_t nSTART_BIN = 128 * ( nLclApv % 2);

      for( uint16_t nBin = 0,
             nAbsBin = nSTART_BIN + nBin + 1; 
           128 > nBin; 
           ++nBin, ++nAbsBin)
        {
          updateTProfile.setBinContent( pedsProf, nAbsBin, 5, 
                                        lclPedestals[nBin], lclNoises[nBin]);
          updateTProfile.setBinContent( noiseProf, nAbsBin, 5,
                                        lclNoises[nBin], 0);
        } // End loop over BINs

      // Samvel: Assume Once CM value is calculated per chip.
      //         In principle Chip can be divided into a several ranges. Then CM
      //         will be calculated per range. !!! UPDATE CODE THEN !!!
      for( ApvAnalysis::PedestalType::const_iterator cmIterator 
             = lclCommonMode.begin();
           cmIterator != lclCommonMode.end();
           ++cmIterator)
        {
          //uint32_t nCM = static_cast<uint32_t>( *cmIterator);
          //if( nCM >= 1024) nCM = 1023;
          //updateHistoSet( cm_[nApv], nCM);
          float nCM = static_cast<float>( *cmIterator );
          updateHistoSet( cm_[nApv], nCM );
        }
      
      std::stringstream out;
      LogTrace( mlDqmSource_)
        << "[NoiseTask::" << __func__ << "] "
        << "DET ID [" << connection().detId() 
        << "] has Common Mode size " << lclCommonMode.size() << " : "
        << ( out << lclCommonMode, out.str());
    } // End loop over Local Apvs

  updateHistoSet( cm_[0]);
  updateHistoSet( cm_[1]);
}

Member Data Documentation

std::vector<HistoSet> NoiseTask::cm_ [private]

Definition at line 32 of file NoiseTask.h.

Referenced by book(), and update().

Definition at line 34 of file NoiseTask.h.

Referenced by book(), fill(), NoiseTask(), update(), and ~NoiseTask().

std::vector<HistoSet> NoiseTask::peds_ [private]

Definition at line 31 of file NoiseTask.h.

Referenced by book(), and update().