CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

VpspScanAlgorithm Class Reference

Histogram-based analysis for VPSP scan. More...

#include <VpspScanAlgorithm.h>

Inheritance diagram for VpspScanAlgorithm:
CommissioningAlgorithm

List of all members.

Public Member Functions

const Histohisto (const uint16_t &apv) const
 VpspScanAlgorithm (const edm::ParameterSet &pset, VpspScanAnalysis *const )
virtual ~VpspScanAlgorithm ()

Private Member Functions

void analyse ()
void extract (const std::vector< TH1 * > &)
 VpspScanAlgorithm ()

Private Attributes

std::vector< Histohistos_

Detailed Description

Histogram-based analysis for VPSP scan.

Author:
M. Wingham, R.Bainbridge

Definition at line 16 of file VpspScanAlgorithm.h.


Constructor & Destructor Documentation

VpspScanAlgorithm::VpspScanAlgorithm ( const edm::ParameterSet pset,
VpspScanAnalysis * const  anal 
)

Definition at line 17 of file VpspScanAlgorithm.cc.

  : CommissioningAlgorithm(anal),
    histos_( 2, Histo(0,"") )
{;}
virtual VpspScanAlgorithm::~VpspScanAlgorithm ( ) [inline, virtual]

Definition at line 22 of file VpspScanAlgorithm.h.

{;}
VpspScanAlgorithm::VpspScanAlgorithm ( ) [inline, private]

Definition at line 29 of file VpspScanAlgorithm.h.

{;}

Member Function Documentation

void VpspScanAlgorithm::analyse ( ) [private, virtual]

Performs histogram anaysis.

Implements CommissioningAlgorithm.

Definition at line 76 of file VpspScanAlgorithm.cc.

References VpspScanAnalysis::adcLevel_, CommissioningAnalysis::addErrorCode(), CommissioningAlgorithm::anal(), VpspScanAnalysis::bottomEdge_, VpspScanAnalysis::bottomLevel_, first, VpspScanAnalysis::fraction_, combine::histos, histos_, sistrip::invalid_, gen::k, prof2calltree::last, sistrip::mlCommissioning_, sistrip::noBaselineLevel_, sistrip::noBottomPlateau_, sistrip::noTopPlateau_, sistrip::noVpspSetting_, sistrip::nullPtr_, tmp, VpspScanAnalysis::topEdge_, VpspScanAnalysis::topLevel_, sistrip::valid_, and VpspScanAnalysis::vpsp_.

                                {

  if ( !anal() ) {
    edm::LogWarning(mlCommissioning_)
      << "[VpspScanAlgorithm::" << __func__ << "]"
      << " NULL pointer to base Analysis object!";
    return; 
  }

  CommissioningAnalysis* tmp = const_cast<CommissioningAnalysis*>( anal() );
  VpspScanAnalysis* anal = dynamic_cast<VpspScanAnalysis*>( tmp );
  if ( !anal ) {
    edm::LogWarning(mlCommissioning_)
      << "[VpspScanAlgorithm::" << __func__ << "]"
      << " NULL pointer to derived Analysis object!";
    return; 
  }

  // from deprecated()
  
  std::vector<const TProfile*> histos; 
  std::vector<uint16_t> monitorables;
  for ( uint16_t iapv = 0; iapv < 2; iapv++ ) {
    
    monitorables.clear();
    monitorables.resize( 7, sistrip::invalid_ );
    
    histos.clear();
    histos.push_back( const_cast<const TProfile*>( dynamic_cast<TProfile*>(histos_[iapv].first) ) );
    
    if ( !histos[0] ) {
      anal->addErrorCode(sistrip::nullPtr_);
      continue;
    }

    // Find "top" plateau
    int first = sistrip::invalid_;
    float top = -1. * sistrip::invalid_;;
    for ( int k = 5; k < 55; k++ ) {
      if ( !histos[0]->GetBinEntries(k) ) { continue; }
      if ( histos[0]->GetBinContent(k) >= top ) { 
        first = k; 
        top = histos[0]->GetBinContent(k); 
      }
    }
    if ( top < -1. * sistrip::valid_ ) { top = sistrip::invalid_; } //@@ just want +ve invalid number here
    if ( top > 1. * sistrip::valid_ ) { 
      anal->addErrorCode(sistrip::noTopPlateau_);
      continue;
    } 
    monitorables[5] = static_cast<uint16_t>(top);
    monitorables[3] = first;
        
    // Find "bottom" plateau
    int last = sistrip::invalid_;
    float bottom = 1. * sistrip::invalid_;
    for ( int k = 55; k > 5; k-- ) {
      if ( !histos[0]->GetBinEntries(k) ) { continue; }
      if ( histos[0]->GetBinContent(k) <= bottom ) { 
        last = k; 
        bottom = histos[0]->GetBinContent(k); 
      }
    }
    if ( bottom > 1. * sistrip::valid_ ) {
      anal->addErrorCode(sistrip::noBottomPlateau_);
      continue;
    } 
    monitorables[6] = static_cast<uint16_t>(bottom);
    monitorables[4] = last;
      
    // Set optimum baseline level
    float opt = bottom + ( top - bottom ) * 1./3.; 
    monitorables[1] = static_cast<uint16_t>(opt);
      
    // Find optimum VPSP setting 
    uint16_t vpsp = sistrip::invalid_;
    if ( opt < 1. * sistrip::valid_ ) {
      uint16_t ivpsp = 5; 
      for ( ; ivpsp < 55; ivpsp++ ) { 
        if ( histos[0]->GetBinContent(ivpsp) < opt ) { break; }
      }
      if ( ivpsp != 54 ) { 
        vpsp = ivpsp; 
        monitorables[0] = vpsp;
      }
      else { 
        anal->addErrorCode(sistrip::noVpspSetting_); 
        continue;
      }
        
    } else { 
      anal->addErrorCode(sistrip::noBaselineLevel_); 
      continue;
    }
    
    // Set analysis results for both APVs
    anal->vpsp_[iapv]        = monitorables[0];
    anal->adcLevel_[iapv]    = monitorables[1];
    anal->fraction_[iapv]    = monitorables[2];
    anal->topEdge_[iapv]     = monitorables[3];
    anal->bottomEdge_[iapv]  = monitorables[4];
    anal->topLevel_[iapv]    = monitorables[5];
    anal->bottomLevel_[iapv] = monitorables[6];
    
  }
  
}
void VpspScanAlgorithm::extract ( const std::vector< TH1 * > &  histos) [private, virtual]

Extracts and organises histograms.

Implements CommissioningAlgorithm.

Definition at line 24 of file VpspScanAlgorithm.cc.

References CommissioningAnalysis::addErrorCode(), CommissioningAlgorithm::anal(), sistrip::apv_, CommissioningAlgorithm::extractFedKey(), CommissioningAnalysis::fedKey(), histos_, sistrip::invalid_, sistrip::mlCommissioning_, sistrip::numberOfHistos_, indexGen::title, sistrip::unexpectedExtraInfo_, sistrip::unexpectedTask_, and sistrip::VPSP_SCAN.

                                                               { 

  if ( !anal() ) {
    edm::LogWarning(mlCommissioning_)
      << "[VpspScanAlgorithm::" << __func__ << "]"
      << " NULL pointer to Analysis object!";
    return; 
  }

  // Check number of histograms
  if ( histos.size() != 2 ) {
    anal()->addErrorCode(sistrip::numberOfHistos_);
  }
  
  // Extract FED key from histo title
  if ( !histos.empty() ) { anal()->fedKey( extractFedKey( histos.front() ) ); }

  // Extract histograms
  std::vector<TH1*>::const_iterator ihis = histos.begin();
  for ( ; ihis != histos.end(); ihis++ ) {
    
    // Check pointer
    if ( !(*ihis) ) { continue; }
    
    // Check name
    SiStripHistoTitle title( (*ihis)->GetName() );
    if ( title.runType() != sistrip::VPSP_SCAN ) {
      anal()->addErrorCode(sistrip::unexpectedTask_);
      continue;
    }
    
    // Extract APV number
    uint16_t apv = sistrip::invalid_; 
    if ( title.extraInfo().find(sistrip::apv_) != std::string::npos ) {
      std::stringstream ss;
      ss << title.extraInfo().substr( title.extraInfo().find(sistrip::apv_) + (sizeof(sistrip::apv_) - 1), 1 );
      ss >> std::dec >> apv;
    }

    if ( apv <= 1 ) {
      histos_[apv].first = *ihis; 
      histos_[apv].second = (*ihis)->GetName();
    } else {
      anal()->addErrorCode(sistrip::unexpectedExtraInfo_);
    }
    
  }

}
const Histo& VpspScanAlgorithm::histo ( const uint16_t &  apv) const

Histogram pointer and title.


Member Data Documentation

std::vector<Histo> VpspScanAlgorithm::histos_ [private]

Pointers and titles for histograms.

Definition at line 40 of file VpspScanAlgorithm.h.

Referenced by analyse(), and extract().