CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_9_patch3/src/SimCalorimetry/HcalSimProducers/src/HcalDigiStatistics.h

Go to the documentation of this file.
00001 #ifndef HcalSimProducers_HcalDigiStatistics_h
00002 #define HcalSimProducers_HcalDigiStatistics_h
00003 
00004 #include "CalibFormats/CaloObjects/interface/CaloSamples.h"
00005 #include "SimCalorimetry/CaloSimAlgos/interface/CaloValidationStatistics.h"
00006 #include "SimCalorimetry/CaloSimAlgos/interface/CaloHitAnalyzer.h"
00007 #include <string>
00008 
00009 class HcalDigiStatistics
00010 {
00011 public:
00012   HcalDigiStatistics(std::string name,
00013                      int maxBin,
00014                      float amplitudeThreshold,
00015                      float expectedPedestal,
00016                      float binPrevToBinMax,
00017                      float binNextToBinMax,
00018                      CaloHitAnalyzer & amplitudeAnalyzer)
00019 :  maxBin_(maxBin),
00020    amplitudeThreshold_(amplitudeThreshold),
00021    pedestal_(name+" pedestal", expectedPedestal, 0.),
00022    binPrevToBinMax_(name+" binPrevToBinMax", binPrevToBinMax, 0.),
00023    binNextToBinMax_(name+" binNextToBinMax", binNextToBinMax, 0.),
00024    amplitudeAnalyzer_(amplitudeAnalyzer)
00025 {
00026 }
00027 
00028   template<class Digi>
00029   void analyze(const Digi & digi);
00030 
00031 private:
00032   int maxBin_;
00033   float amplitudeThreshold_;
00034   CaloValidationStatistics pedestal_;
00035   CaloValidationStatistics binPrevToBinMax_;
00036   CaloValidationStatistics binNextToBinMax_;
00037   CaloHitAnalyzer & amplitudeAnalyzer_;
00038 };
00039 
00040 
00041 template<class Digi>
00042 void HcalDigiStatistics::analyze(const Digi & digi) {
00043    pedestal_.addEntry(digi[0].adc());
00044    pedestal_.addEntry(digi[1].adc());
00045                                                                                
00046                                                                                
00047    double pedestal_fC = 0.5*(digi[0].nominal_fC() + digi[1].nominal_fC());
00048                                                                                
00049                                                                               
00050   double maxAmplitude = digi[maxBin_].nominal_fC()   - pedestal_fC;
00051                                                                               
00052   if(maxAmplitude > amplitudeThreshold_) {
00053                                                                               
00054     double binPrevToBinMax = (digi[maxBin_-1].nominal_fC() - pedestal_fC)
00055                            / maxAmplitude;
00056     binPrevToBinMax_.addEntry(binPrevToBinMax);
00057                                                                               
00058                                                                               
00059     double binNextToBinMax = (digi[maxBin_+1].nominal_fC() - pedestal_fC)
00060                            / maxAmplitude;
00061     binNextToBinMax_.addEntry(binNextToBinMax);
00062                                                                               
00063     double amplitude = digi[maxBin_].nominal_fC()
00064                    + digi[maxBin_+1].nominal_fC()
00065                    - 2*pedestal_fC;
00066                                                                                 
00067                                                                                 
00068     amplitudeAnalyzer_.analyze(digi.id().rawId(), amplitude);
00069                                                                                 
00070   }
00071 }
00072 
00073 #endif
00074