CMS 3D CMS Logo

/afs/cern.ch/work/c/cnuttens/private/SiStripDev/DocumentationProduction/CMSSW_6_1_0/src/SimTracker/SiStripDigitizer/plugins/SiGaussianTailNoiseAdder.cc

Go to the documentation of this file.
00001 #include "SiGaussianTailNoiseAdder.h"
00002 #include "FWCore/ServiceRegistry/interface/Service.h"
00003 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00004 #include "CLHEP/Random/RandGaussQ.h"
00005 #include "FWCore/Utilities/interface/Exception.h"
00006 
00007 SiGaussianTailNoiseAdder::SiGaussianTailNoiseAdder(float th,CLHEP::HepRandomEngine& eng):
00008   threshold(th),
00009   rndEngine(eng),
00010   gaussDistribution(new CLHEP::RandGaussQ(rndEngine)),
00011   genNoise(new GaussianTailNoiseGenerator(rndEngine))
00012 {
00013 }
00014 
00015 SiGaussianTailNoiseAdder::~SiGaussianTailNoiseAdder(){
00016 }
00017 
00018 void SiGaussianTailNoiseAdder::addNoise(std::vector<double> &in,
00019                                         size_t& minChannel, size_t& maxChannel,
00020                                         int numStrips, float noiseRMS) const {
00021  
00022   std::vector<std::pair<int,float> > generatedNoise;
00023   genNoise->generate(numStrips,threshold,noiseRMS,generatedNoise);
00024   
00025   // noise on strips with signal:
00026   for (size_t iChannel=minChannel; iChannel<maxChannel; iChannel++) {
00027     if(in[iChannel] != 0) {
00028       in[iChannel] += gaussDistribution->fire(0.,noiseRMS);
00029     }
00030   }
00031 
00032   // Noise on the other strips
00033   typedef std::vector<std::pair<int,float> >::const_iterator VI;  
00034   for(VI p = generatedNoise.begin(); p != generatedNoise.end(); p++){
00035     if(in[(*p).first] == 0) {
00036       in[(*p).first] += (*p).second;
00037     }
00038   }
00039 }
00040 
00041 void SiGaussianTailNoiseAdder::addNoiseVR(std::vector<double> &in, std::vector<float> &noiseRMS) const {
00042   // Add noise
00043   // Full Gaussian noise is added everywhere
00044   for (size_t iChannel=0; iChannel!=in.size(); iChannel++) {
00045      if(noiseRMS[iChannel] > 0.) in[iChannel] += gaussDistribution->fire(0.,noiseRMS[iChannel]);
00046   }
00047 }
00048 
00049 void SiGaussianTailNoiseAdder::addPedestals(std::vector<double> &in,std::vector<float> & ped) const {
00050         for (size_t iChannel=0; iChannel!=in.size(); iChannel++) {
00051       if(ped[iChannel]>0.) in[iChannel] += ped[iChannel];      
00052     }
00053 }
00054 
00055 void SiGaussianTailNoiseAdder::addCMNoise(std::vector<double> &in, float cmnRMS, std::vector<bool> &badChannels) const {
00056   int nAPVs = in.size()/128;
00057   std::vector<float> CMNv;
00058   for(int APVn =0; APVn < nAPVs; ++APVn) CMNv.push_back(gaussDistribution->fire(0.,cmnRMS));
00059   for (size_t iChannel=0; iChannel!=in.size(); iChannel++) {
00060      if(!badChannels[iChannel]) in[iChannel] += CMNv[(int)(iChannel/128)];
00061   }
00062 }
00063 
00064 void SiGaussianTailNoiseAdder::addBaselineShift(std::vector<double> &in, std::vector<bool> &badChannels) const {
00065   size_t nAPVs = in.size()/128;
00066   std::vector<float> vShift;
00067   double apvCharge, apvMult;
00068   
00069   size_t iChannel;
00070   for(size_t APVn =0; APVn < nAPVs; ++APVn){
00071         apvMult=0; apvCharge=0;
00072         for(iChannel=APVn*128; iChannel!=APVn*128+128; ++iChannel) {
00073            if(in[iChannel]>0){
00074                  ++apvMult;
00075                   apvCharge+= in[iChannel];
00076            }
00077            if(apvMult==0) vShift.push_back(0);
00078            else vShift.push_back(apvCharge/apvMult);
00079         }
00080   }
00081      
00082   for (iChannel=0; iChannel!=in.size(); ++iChannel) {
00083      if(!badChannels[iChannel]) in[iChannel] -= vShift[(int)(iChannel/128)];
00084   }
00085 }
00086 
00087 
00088 
00089 
00090