CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiTrivialDigitalConverter.cc
Go to the documentation of this file.
4 
6  electronperADC(in), PreMixing_(PreMix) {
7  _temp.reserve(800);
8  _tempRaw.reserve(800);
9 }
10 
12 SiTrivialDigitalConverter::convert(const std::vector<float>& analogSignal, edm::ESHandle<SiStripGain> & gainHandle, unsigned int detid){
13 
14  _temp.clear();
15 
16  if(PreMixing_) {
17  for ( size_t i=0; i<analogSignal.size(); i++) {
18  if (analogSignal[i]<=0) continue;
19  // convert analog amplitude to digital - special algorithm for PreMixing.
20  // Need to keep all hits, including those at very low pulse heights.
21  int adc = truncate( sqrt(9.0*analogSignal[i]) );
22  if ( adc > 0) _temp.push_back(SiStripDigi(i, adc));
23  }
24  }
25  else if(gainHandle.isValid()) {
26  SiStripApvGain::Range detGainRange = gainHandle->getRange(detid);
27  for ( size_t i=0; i<analogSignal.size(); i++) {
28  if (analogSignal[i]<=0) continue;
29  // convert analog amplitude to digital
30  int adc = convert( (gainHandle->getStripGain(i, detGainRange))*(analogSignal[i]) );
31  if ( adc > 0) _temp.push_back(SiStripDigi(i, adc));
32  }
33  } else {
34  for ( size_t i=0; i<analogSignal.size(); i++) {
35  if (analogSignal[i]<=0) continue;
36  // convert analog amplitude to digital
37  int adc = convert( analogSignal[i] );
38  if ( adc > 0) _temp.push_back(SiStripDigi(i, adc));
39  }
40  }
41  return _temp;
42 }
43 
45 SiTrivialDigitalConverter::convertRaw(const std::vector<float>& analogSignal, edm::ESHandle<SiStripGain> & gainHandle, unsigned int detid){
46 
47  _tempRaw.clear();
48 
49  if(gainHandle.isValid()) {
50  SiStripApvGain::Range detGainRange = gainHandle->getRange(detid);
51  for ( size_t i=0; i<analogSignal.size(); i++) {
52  if (analogSignal[i]<=0) { _tempRaw.push_back(SiStripRawDigi(0)); continue; }
53  // convert analog amplitude to digital
54  int adc = convertRaw( (gainHandle->getStripGain(i, detGainRange))*(analogSignal[i]));
55  _tempRaw.push_back(SiStripRawDigi(adc));
56  }
57  } else {
58  for ( size_t i=0; i<analogSignal.size(); i++) {
59  if (analogSignal[i]<=0) { _tempRaw.push_back(SiStripRawDigi(0)); continue; }
60  // convert analog amplitude to digital
61  int adc = convertRaw( analogSignal[i] );
62  _tempRaw.push_back(SiStripRawDigi(adc));
63  }
64  }
65  return _tempRaw;
66 }
67 
68 int SiTrivialDigitalConverter::truncate(float in_adc) const {
69  //Rounding the ADC number instead of truncating it
70  int adc = int(in_adc+0.5);
71  /*
72  254 ADC: 254 <= raw charge < 1023
73  255 ADC: raw charge >= 1023
74  */
75  if(PreMixing_) {
76  if (adc > 2047 ) return 1023;
77  if (adc > 1022 ) return 1022;
78  }
79  else {
80  if (adc > 1022 ) return 255;
81  if (adc > 253) return 254;
82  }
83  //Protection
84  if (adc < 0) return 0;
85  return adc;
86 }
87 
88 int SiTrivialDigitalConverter::truncateRaw(float in_adc) const {
89  //Rounding the ADC number
90  int adc = int(in_adc+0.5);
91  if (adc > 1023 ) return 1023;
92  //Protection
93  if (adc < 0) return 0;
94  return adc;
95 }
96 
int adc(sample_type sample)
get the ADC sample (12 bits)
std::vector< SiStripDigi > DigitalVecType
int i
Definition: DBlmapReader.cc:9
DigitalVecType convert(const std::vector< float > &, edm::ESHandle< SiStripGain > &, unsigned int detid)
int truncateRaw(float in_adc) const
SiTrivialDigitalConverter(float in, bool PreMix)
DigitalRawVecType convertRaw(const std::vector< float > &, edm::ESHandle< SiStripGain > &, unsigned int detid)
std::vector< SiStripRawDigi > DigitalRawVecType
int truncate(float in_adc) const
T sqrt(T t)
Definition: SSEVec.h:18
std::pair< ContainerIterator, ContainerIterator > Range
SiDigitalConverter::DigitalRawVecType _tempRaw
A Digi for the silicon strip detector, containing both strip and adc information, and suitable for st...
Definition: SiStripDigi.h:12
bool isValid() const
Definition: ESHandle.h:47
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
SiDigitalConverter::DigitalVecType _temp