Go to the documentation of this file.00001 #include "DQM/SiStripCommissioningAnalysis/interface/PedestalsAlgorithm.h"
00002 #include "CondFormats/SiStripObjects/interface/PedestalsAnalysis.h"
00003 #include "DataFormats/SiStripCommon/interface/SiStripHistoTitle.h"
00004 #include "DataFormats/SiStripCommon/interface/SiStripEnumsAndStrings.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006 #include "TProfile.h"
00007 #include "TH1.h"
00008 #include <iostream>
00009 #include <iomanip>
00010 #include <cmath>
00011
00012 using namespace sistrip;
00013
00014
00015
00016 PedestalsAlgorithm::PedestalsAlgorithm( const edm::ParameterSet & pset, PedestalsAnalysis* const anal )
00017 : CommissioningAlgorithm(anal),
00018 hPeds_(0,""),
00019 hNoise_(0,""),
00020 deadStripMax_(pset.getParameter<double>("DeadStripMax")),
00021 noisyStripMin_(pset.getParameter<double>("NoisyStripMin"))
00022 {
00023 LogDebug(mlCommissioning_)
00024 << "[PedestalsAlgorithm::" << __func__ << "]"
00025 << " Set maximum noise deviation for dead strip determination to: " << deadStripMax_;
00026 LogDebug(mlCommissioning_)
00027 << "[PedestalsAlgorithm::" << __func__ << "]"
00028 << " Set minimal noise deviation for noisy strip determination to: " << noisyStripMin_;
00029 }
00030
00031
00032
00033 void PedestalsAlgorithm::extract( const std::vector<TH1*>& histos ) {
00034
00035 if ( !anal() ) {
00036 edm::LogWarning(mlCommissioning_)
00037 << "[PedestalsAlgorithm::" << __func__ << "]"
00038 << " NULL pointer to Analysis object!";
00039 return;
00040 }
00041
00042
00043 if ( histos.size() != 2 ) {
00044 anal()->addErrorCode(sistrip::numberOfHistos_);
00045 }
00046
00047
00048 if ( !histos.empty() ) { anal()->fedKey( extractFedKey( histos.front() ) ); }
00049
00050
00051 std::vector<TH1*>::const_iterator ihis = histos.begin();
00052 for ( ; ihis != histos.end(); ihis++ ) {
00053
00054
00055 if ( !(*ihis) ) { continue; }
00056
00057
00058 SiStripHistoTitle title( (*ihis)->GetName() );
00059 if ( title.runType() != sistrip::PEDESTALS ) {
00060 anal()->addErrorCode(sistrip::unexpectedTask_);
00061 continue;
00062 }
00063
00064
00065 if ( title.extraInfo().find(sistrip::extrainfo::pedsAndRawNoise_) != std::string::npos ) {
00066 hPeds_.first = *ihis;
00067 hPeds_.second = (*ihis)->GetName();
00068 PedestalsAnalysis* a = dynamic_cast<PedestalsAnalysis*>( const_cast<CommissioningAnalysis*>( anal() ) );
00069 if ( a ) { a->legacy_ = true; }
00070 } else if ( title.extraInfo().find(sistrip::extrainfo::pedsAndCmSubNoise_) != std::string::npos ) {
00071 hNoise_.first = *ihis;
00072 hNoise_.second = (*ihis)->GetName();
00073 PedestalsAnalysis* a = dynamic_cast<PedestalsAnalysis*>( const_cast<CommissioningAnalysis*>( anal() ) );
00074 if ( a ) { a->legacy_ = true; }
00075 } else if ( title.extraInfo().find(sistrip::extrainfo::pedestals_) != std::string::npos ) {
00076 hPeds_.first = *ihis;
00077 hPeds_.second = (*ihis)->GetName();
00078 } else if ( title.extraInfo().find(sistrip::extrainfo::noise_) != std::string::npos ) {
00079 hNoise_.first = *ihis;
00080 hNoise_.second = (*ihis)->GetName();
00081 } else if ( title.extraInfo().find(sistrip::extrainfo::commonMode_) != std::string::npos ) {
00082
00083 } else {
00084 anal()->addErrorCode(sistrip::unexpectedExtraInfo_);
00085 }
00086
00087 }
00088
00089 }
00090
00091
00092
00093 void PedestalsAlgorithm::analyse() {
00094
00095 if ( !anal() ) {
00096 edm::LogWarning(mlCommissioning_)
00097 << "[PedestalsAlgorithm::" << __func__ << "]"
00098 << " NULL pointer to base Analysis object!";
00099 return;
00100 }
00101
00102 CommissioningAnalysis* tmp = const_cast<CommissioningAnalysis*>( anal() );
00103 PedestalsAnalysis* anal = dynamic_cast<PedestalsAnalysis*>( tmp );
00104 if ( !anal ) {
00105 edm::LogWarning(mlCommissioning_)
00106 << "[PedestalsAlgorithm::" << __func__ << "]"
00107 << " NULL pointer to derived Analysis object!";
00108 return;
00109 }
00110
00111 if ( !hPeds_.first ) {
00112 anal->addErrorCode(sistrip::nullPtr_);
00113 return;
00114 }
00115
00116 if ( !hNoise_.first ) {
00117 anal->addErrorCode(sistrip::nullPtr_);
00118 return;
00119 }
00120
00121 TProfile* peds_histo = dynamic_cast<TProfile*>(hPeds_.first);
00122 TProfile* noise_histo = dynamic_cast<TProfile*>(hNoise_.first);
00123
00124 if ( !peds_histo ) {
00125 anal->addErrorCode(sistrip::nullPtr_);
00126 return;
00127 }
00128
00129 if ( !noise_histo ) {
00130 anal->addErrorCode(sistrip::nullPtr_);
00131 return;
00132 }
00133
00134 if ( peds_histo->GetNbinsX() != 256 ) {
00135 anal->addErrorCode(sistrip::numberOfBins_);
00136 return;
00137 }
00138
00139 if ( noise_histo->GetNbinsX() != 256 ) {
00140 anal->addErrorCode(sistrip::numberOfBins_);
00141 return;
00142 }
00143
00144
00145 for ( uint16_t iapv = 0; iapv < 2; iapv++ ) {
00146
00147
00148 float p_sum = 0., p_sum2 = 0., p_max = -1.*sistrip::invalid_, p_min = sistrip::invalid_;
00149 float n_sum = 0., n_sum2 = 0., n_max = -1.*sistrip::invalid_, n_min = sistrip::invalid_;
00150 float r_sum = 0., r_sum2 = 0., r_max = -1.*sistrip::invalid_, r_min = sistrip::invalid_;
00151
00152
00153 for ( uint16_t istr = 0; istr < 128; istr++ ) {
00154
00155 static uint16_t strip;
00156 strip = iapv*128 + istr;
00157
00158
00159 if ( peds_histo ) {
00160 if ( peds_histo->GetBinEntries(strip+1) ) {
00161
00162 anal->peds_[iapv][istr] = peds_histo->GetBinContent(strip+1);
00163 p_sum += anal->peds_[iapv][istr];
00164 p_sum2 += (anal->peds_[iapv][istr] * anal->peds_[iapv][istr]);
00165 if ( anal->peds_[iapv][istr] > p_max ) { p_max = anal->peds_[iapv][istr]; }
00166 if ( anal->peds_[iapv][istr] < p_min ) { p_min = anal->peds_[iapv][istr]; }
00167
00168 anal->raw_[iapv][istr] = peds_histo->GetBinError(strip+1);
00169 r_sum += anal->raw_[iapv][istr];
00170 r_sum2 += (anal->raw_[iapv][istr] * anal->raw_[iapv][istr]);
00171 if ( anal->raw_[iapv][istr] > r_max ) { r_max = anal->raw_[iapv][istr]; }
00172 if ( anal->raw_[iapv][istr] < r_min ) { r_min = anal->raw_[iapv][istr]; }
00173
00174 }
00175 }
00176
00177
00178 if ( noise_histo ) {
00179 if ( noise_histo->GetBinEntries(strip+1) ) {
00180 anal->noise_[iapv][istr] = noise_histo->GetBinContent(strip+1);
00181 n_sum += anal->noise_[iapv][istr];
00182 n_sum2 += (anal->noise_[iapv][istr] * anal->noise_[iapv][istr]);
00183 if ( anal->noise_[iapv][istr] > n_max ) { n_max = anal->noise_[iapv][istr]; }
00184 if ( anal->noise_[iapv][istr] < n_min ) { n_min = anal->noise_[iapv][istr]; }
00185 }
00186 }
00187
00188 }
00189
00190
00191 if ( !anal->peds_[iapv].empty() ) {
00192 p_sum /= static_cast<float>( anal->peds_[iapv].size() );
00193 p_sum2 /= static_cast<float>( anal->peds_[iapv].size() );
00194 anal->pedsMean_[iapv] = p_sum;
00195 anal->pedsSpread_[iapv] = sqrt( fabs(p_sum2 - p_sum*p_sum) );
00196 }
00197
00198
00199 if ( !anal->noise_[iapv].empty() ) {
00200 n_sum /= static_cast<float>( anal->noise_[iapv].size() );
00201 n_sum2 /= static_cast<float>( anal->noise_[iapv].size() );
00202 anal->noiseMean_[iapv] = n_sum;
00203 anal->noiseSpread_[iapv] = sqrt( fabs(n_sum2 - n_sum*n_sum) );
00204 }
00205
00206
00207 if ( !anal->raw_[iapv].empty() ) {
00208 r_sum /= static_cast<float>( anal->raw_[iapv].size() );
00209 r_sum2 /= static_cast<float>( anal->raw_[iapv].size() );
00210 anal->rawMean_[iapv] = r_sum;
00211 anal->rawSpread_[iapv] = sqrt( fabs(r_sum2 - r_sum*r_sum) );
00212 }
00213
00214
00215 if ( p_max > -1.*sistrip::maximum_ ) { anal->pedsMax_[iapv] = p_max; }
00216 if ( p_min < 1.*sistrip::maximum_ ) { anal->pedsMin_[iapv] = p_min; }
00217 if ( n_max > -1.*sistrip::maximum_ ) { anal->noiseMax_[iapv] = n_max; }
00218 if ( n_min < 1.*sistrip::maximum_ ) { anal->noiseMin_[iapv] = n_min; }
00219 if ( r_max > -1.*sistrip::maximum_ ) { anal->rawMax_[iapv] = r_max; }
00220 if ( r_min < 1.*sistrip::maximum_ ) { anal->rawMin_[iapv] = r_min; }
00221
00222
00223 for ( uint16_t istr = 0; istr < 128; istr++ ) {
00224 if ( anal->noiseMin_[iapv] > sistrip::maximum_ ||
00225 anal->noiseMax_[iapv] > sistrip::maximum_ ) { continue; }
00226 if ( anal->noise_[iapv][istr] < ( anal->noiseMean_[iapv] - deadStripMax_ * anal->noiseSpread_[iapv] ) ) {
00227 anal->dead_[iapv].push_back(istr);
00228 }
00229 else if ( anal->noise_[iapv][istr] > ( anal->noiseMean_[iapv] + noisyStripMin_ * anal->noiseSpread_[iapv] ) ) {
00230 anal->noisy_[iapv].push_back(istr);
00231 }
00232 }
00233
00234 }
00235
00236 }