CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/SimTracker/SiStripDigitizer/plugins/SiTrivialDigitalConverter.cc

Go to the documentation of this file.
00001 #include "SiTrivialDigitalConverter.h"
00002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00004 
00005 SiTrivialDigitalConverter::SiTrivialDigitalConverter(float in) :
00006   electronperADC(in) {
00007   _temp.reserve(800);
00008   _tempRaw.reserve(800);
00009 }
00010 
00011 SiDigitalConverter::DigitalVecType
00012 SiTrivialDigitalConverter::convert(const std::vector<float>& analogSignal, edm::ESHandle<SiStripGain> & gainHandle, unsigned int detid){
00013   
00014   _temp.clear();
00015   
00016   if(gainHandle.isValid()) {
00017     SiStripApvGain::Range detGainRange = gainHandle->getRange(detid);
00018     for ( size_t i=0; i<analogSignal.size(); i++) {
00019       if (analogSignal[i]<=0) continue;
00020       // convert analog amplitude to digital
00021       int adc = convert( (gainHandle->getStripGain(i, detGainRange))*(analogSignal[i]) );
00022       if ( adc > 0) _temp.push_back(SiStripDigi(i, adc));
00023     }
00024   } else {
00025     for ( size_t i=0; i<analogSignal.size(); i++) {
00026       if (analogSignal[i]<=0) continue;
00027       // convert analog amplitude to digital
00028       int adc = convert( analogSignal[i] );
00029       if ( adc > 0) _temp.push_back(SiStripDigi(i, adc));
00030     }
00031   }
00032   return _temp;
00033 }
00034 
00035 SiDigitalConverter::DigitalRawVecType
00036 SiTrivialDigitalConverter::convertRaw(const std::vector<float>& analogSignal, edm::ESHandle<SiStripGain> & gainHandle, unsigned int detid){
00037   
00038   _tempRaw.clear();
00039 
00040   if(gainHandle.isValid()) {
00041     SiStripApvGain::Range detGainRange = gainHandle->getRange(detid);
00042     for ( size_t i=0; i<analogSignal.size(); i++) {
00043       if (analogSignal[i]<=0) { _tempRaw.push_back(SiStripRawDigi(0)); continue; }
00044       // convert analog amplitude to digital
00045       int adc = convertRaw( (gainHandle->getStripGain(i, detGainRange))*(analogSignal[i]));
00046       _tempRaw.push_back(SiStripRawDigi(adc));
00047     }
00048   } else {
00049     for ( size_t i=0; i<analogSignal.size(); i++) {
00050       if (analogSignal[i]<=0) { _tempRaw.push_back(SiStripRawDigi(0)); continue; }
00051       // convert analog amplitude to digital
00052       int adc = convertRaw( analogSignal[i] );
00053       _tempRaw.push_back(SiStripRawDigi(adc));
00054     }
00055   }
00056   return _tempRaw;
00057 }
00058 
00059 int SiTrivialDigitalConverter::truncate(float in_adc) const {
00060   //Rounding the ADC number instead of truncating it
00061   int adc = int(in_adc+0.5);
00062   /*
00063     254 ADC: 254  <= raw charge < 1023
00064     255 ADC: raw charge >= 1023
00065   */
00066   if (adc > 1022 ) return 255;
00067   if (adc > 253) return 254;
00068   //Protection
00069   if (adc < 0) return 0;
00070   return adc;
00071 }
00072 
00073 int SiTrivialDigitalConverter::truncateRaw(float in_adc) const {
00074   //Rounding the ADC number
00075   int adc = int(in_adc+0.5);
00076   if (adc > 1023 ) return 1023;
00077   //Protection
00078   if (adc < 0) return 0;
00079   return adc;
00080 }
00081