CMS 3D CMS Logo

Public Types | Public Member Functions | Private Member Functions | Private Attributes

ESElectronicsSim Class Reference

#include <ESElectronicsSim.h>

List of all members.

Public Types

enum  { MAXADC = 4095 }
enum  { MINADC = 0 }

Public Member Functions

virtual void analogToDigital (const CaloSamples &cs, ESDataFrame &df) const
virtual void digitalToAnalog (const ESDataFrame &df, CaloSamples &cs) const
 ESElectronicsSim (bool addNoise)
void newEvent ()
 anything that needs to be done once per event
void setGain (const int gain)
void setMIPs (const ESIntercalibConstants *mips)
void setMIPToGeV (const double MIPToGeV)
void setPedestals (const ESPedestals *peds)
virtual ~ESElectronicsSim ()

Private Member Functions

double decode (const ESSample &sample, const DetId &detId) const
std::vector< ESSampleencode (const CaloSamples &timeframe) const

Private Attributes

bool addNoise_
int gain_
const ESIntercalibConstantsmips_
double MIPToGeV_
const ESPedestalspeds_

Detailed Description

Definition at line 12 of file ESElectronicsSim.h.


Member Enumeration Documentation

anonymous enum
Enumerator:
MAXADC 

Definition at line 16 of file ESElectronicsSim.h.

{MAXADC = 4095};
anonymous enum
Enumerator:
MINADC 

Definition at line 17 of file ESElectronicsSim.h.

{MINADC = 0};

Constructor & Destructor Documentation

ESElectronicsSim::ESElectronicsSim ( bool  addNoise)

Definition at line 11 of file ESElectronicsSim.cc.

                                                :
  addNoise_(addNoise), peds_(0), mips_(0)
{
  // Preshower Electronics Simulation
  // gain = 1 : low gain for data taking 
  // gain = 2 : high gain for calibration and low energy runs
  // For 300(310/320) um Si, the MIP is 78.47(81.08/83.7) keV
}
ESElectronicsSim::~ESElectronicsSim ( ) [virtual]

Definition at line 20 of file ESElectronicsSim.cc.

{}

Member Function Documentation

void ESElectronicsSim::analogToDigital ( const CaloSamples cs,
ESDataFrame df 
) const [virtual]

Definition at line 23 of file ESElectronicsSim.cc.

References encode(), i, ESDataFrame::setSample(), ESDataFrame::setSize(), ESDataFrame::size(), and CaloSamples::size().

{

  std::vector<ESSample> essamples = encode(cs);

  df.setSize(cs.size());
  for(int i=0; i<df.size(); i++) {
    df.setSample(i, essamples[i]);
  }

}
double ESElectronicsSim::decode ( const ESSample sample,
const DetId detId 
) const [private]

Definition at line 483 of file EcalDumpRaw.cc.

References EcalDumpRaw::adc_, EcalDumpRaw::amplCut_, EcalDumpRaw::bx_, dtNoiseDBValidation_cfg::cerr, colorNames, gather_cfg::cout, pyrootRender::da, dtTPAnalyzer_cfg::dataType, EcalDumpRaw::dccCh_, EcalDumpRaw::dccChStatus_, EcalDumpRaw::dccId_, detailedTrigNames, EcalDumpRaw::detailedTrigType_, EcalDumpRaw::dump_, EcalDumpRaw::dumpAdc_, EcalDumpRaw::ebmTcc_, EcalDumpRaw::ebpTcc_, EcalDumpRaw::eeInnerTcc_, EcalDumpRaw::eeOuterTcc_, EcalDumpRaw::feBx_, EcalDumpRaw::fedId_, EcalDumpRaw::fedStart_, EcalDumpRaw::feL1a_, EcalDumpRaw::feRuId_, lumiContext::fill, g, i, EcalDumpRaw::iRu_, EcalDumpRaw::iSrWord64_, EcalDumpRaw::iTcc_, EcalDumpRaw::iTccWord64_, EcalDumpRaw::iTowerWord64_, EcalDumpRaw::l1a_, EcalDumpRaw::lastOrbit_, EcalDumpRaw::max(), max(), EcalDumpRaw::maxTccsPerDcc_, EcalDumpRaw::maxTpgsPerTcc_, mgpaGainFactors, EcalDumpRaw::min(), EcalDumpRaw::nDccs_, EcalDumpRaw::nRu_, EcalDumpRaw::nTpgs_, EcalDumpRaw::nTts_, EcalDumpRaw::orbit0_, EcalDumpRaw::orbit0Set_, EcalDumpRaw::orbit_, alignCSCRings::s, EcalDumpRaw::side_, EcalDumpRaw::sideOfRu(), EcalDumpRaw::simpleTrigType_, EcalDumpRaw::srpBx_, EcalDumpRaw::srpL1a_, EcalDumpRaw::srRange(), EcalDumpRaw::tccBlockLen64_, EcalDumpRaw::tccId_, EcalDumpRaw::tccL1a_, EcalDumpRaw::tccType_, EcalDumpRaw::towerBlockLength_, EcalDumpRaw::tpg_, EcalDumpRaw::tpgTag(), trigNames, EcalDumpRaw::ttfTag(), and ttsNames.

Referenced by digitalToAnalog().

                                                                       {
  bool rc = true;
  const bool d  = dump_;
  if(iWord64==0){//start of event
    iSrWord64_ = 0;
    iTccWord64_ = 0;
    iTowerWord64_ = 0;
  }
  int dataType = (data[1] >>28) & 0xF;
  const int boe = 5;
  const int eoe = 10;
  if(dataType==boe){//Begin of Event header
    /**********************************************************************
     *  DAQ header
     *
     **********************************************************************/
    simpleTrigType_ = (data[1] >>24) & 0xF;
    l1a_ = (data[1]>>0 )  & 0xFFffFF;
    bx_ = (data[0] >>20) & 0xFFF;
    fedId_ = (data[0] >>8 ) & 0xFFF;
    if(d) out << "Trigger type: " << simpleTrigType_
              << "(" << trigNames[(data[1]>>24) & 0xF] << ")"
              << " L1A: "         << l1a_
              << " BX: "          << bx_
              << " FED ID: "      << fedId_
              << " FOV: "         << ((data[0] >>4 ) & 0xF)
              << " H: "           << ((data[0] >>3 ) & 0x1);
  } else if((dataType>>2)==0){//DCC header
    /**********************************************************************
     * ECAL DCC header
     *
     **********************************************************************/
    int dccHeaderId = (data[1] >>24) & 0x3F;
    switch(dccHeaderId){
    case 1:
      if(d) out << "Run #: "     << ((data[1] >>0 ) & 0xFFFFFF)
                << " DCC Err: "  << ((data[0] >>24) & 0xFF)
                << " Evt Len:  " << ((data[0] >>0 ) & 0xFFFFFF);
      break;
    case 2:
      side_ = (data[1] >>11) & 0x1;
      detailedTrigType_ = (data[1] >>8 ) & 0x7;
      dccId_ = (data[1] >>0 ) & 0x3F;
      if(d) out << "DCC FOV: " << ((data[1] >>16) & 0xF)
                << " Side: "   << side_
                << " Trig.: "   << detailedTrigType_
                << " (" << detailedTrigNames[(data[1]>>8)&0x7] << ")"
                << " Color: "  << ((data[1] >>6 ) & 0x3)
                << " (" << colorNames[(data[1]>>6)&0x3] << ")"
                << " DCC ID: " << dccId_;
      break;
    case 3:
      {
      if(d) out << "TCC Status ch<4..1>: 0x"
                << hex << ((data[1]>>8) & 0xFFFF) << dec
                << " SR status: " << ((data[1] >>4 ) & 0xF)
                << " TZS: "       << ((data[1] >>2 ) & 0x1)
                << " ZS: "        << ((data[1] >>1 ) & 0x1)
                << " SR: "        << ((data[1] >>0 ) & 0x1);
      orbit_ = data[0];
      if(d) out << " Orbit: "     << orbit_;
      if(!orbit0Set_){
        orbit0_ = orbit_;
        orbit0Set_ = true;
      }
      int iDcc0 = fedId_-fedStart_;
      if((unsigned)iDcc0<nDccs_){
        if(lastOrbit_[iDcc0]!=numeric_limits<uint32_t>::max()){
          if(d) out << " (+" << (int)orbit_-(int)lastOrbit_[iDcc0] <<")";
        }
        lastOrbit_[iDcc0] = orbit_;
      }
    }
      break;
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
      {
        int chOffset = (dccHeaderId-4)*14;
        dccChStatus_[13+chOffset] = ((data[1] >>20) & 0xF);
        dccChStatus_[12+chOffset] = ((data[1] >>16) & 0xF);
        dccChStatus_[11+chOffset] = ((data[1] >>12) & 0xF);
        dccChStatus_[10+chOffset] = ((data[1] >>8 ) & 0xF);
        dccChStatus_[ 9+chOffset] = ((data[1] >>4 ) & 0xF);
        dccChStatus_[ 8+chOffset] = ((data[1] >>0)  & 0xF);
        dccChStatus_[ 7+chOffset] = ((data[0] >>28) & 0xF);
        dccChStatus_[ 6+chOffset] = ((data[0] >>24) & 0xF);
        dccChStatus_[ 5+chOffset] = ((data[0] >>20) & 0xF);
        dccChStatus_[ 4+chOffset] = ((data[0] >>16) & 0xF);
        dccChStatus_[ 3+chOffset] = ((data[0] >>12) & 0xF);
        dccChStatus_[ 2+chOffset] = ((data[0] >>8 ) & 0xF);
        dccChStatus_[ 1+chOffset] = ((data[0] >>4 ) & 0xF);
        dccChStatus_[ 0+chOffset] = ((data[0] >>0 ) & 0xF);
        
        if(d){
          out << "FE CH status:";
          for(int i = chOffset; i < chOffset + 14; ++i){
            out << " #" << (i+1) << ":" << dccChStatus_[i];
          }
        }
      }
      break;
    default:
      if(d) out << " bits<63..62>=0 (DCC header) bits<61..56>=" << dccHeaderId
                << "(unknown=>ERROR?)";
    }
  } else if((dataType>>1)==3){//TCC block
    /**********************************************************************
     * TCC block
     *
     **********************************************************************/
    if(iTccWord64_==0){
      //header
      tccL1a_ = (data[1] >>0 ) & 0xFFF;
      tccId_  = ((data[0] >>0 ) & 0xFF);
      nTts_  =  ((data[1] >>16) & 0x7F);
      if(iTcc_ < maxTccsPerDcc_) nTpgs_[iTcc_] = nTts_;
      ++iTcc_;
      if(d) out << "LE1: "         << ((data[1] >>28) & 0x1)
                << " LE0: "        << ((data[1] >>27) & 0x1)
                << " N_samples: "  << ((data[1] >>23) & 0x1F)
                << " N_TTs: "      << nTts_
                << " E1: "         << ((data[1] >>12) & 0x1)
                << " L1A: "        << tccL1a_
                << " '3': "        << ((data[0] >>29) & 0x7)
                << " E0: "         << ((data[0] >>28) & 0x1)
                << " Bx: "         << ((data[0] >>16) & 0xFFF)
                << " TTC ID: "     << tccId_;
      if(nTts_==68){ //EB TCC (TCC68)
        if(fedId_ < 628) tccType_ = ebmTcc_;
        else tccType_ = ebpTcc_;
      } else if(nTts_ == 16){//Inner EE TCC (TCC48)
        tccType_ = eeOuterTcc_;
      } else if(nTts_ == 28){//Outer EE TCC (TCC48)
        tccType_ = eeInnerTcc_;
      } else {
        cout << flush;
        cerr << "Error in #TT field of TCC block."
          "This field is normally used to determine type of TCC "
          "(TCC48 or TCC68). Type of TCC will be deduced from the TCC ID.\n";
        if(tccId_ < 19) tccType_ = eeInnerTcc_;
        else if(tccId_ <  37) tccType_ = eeOuterTcc_;
        else if(tccId_ <  55) tccType_ = ebmTcc_;
        else if(tccId_ <  73) tccType_ = ebpTcc_;
        else if(tccId_ <  91) tccType_ = eeOuterTcc_;
        else if(tccId_ < 109) tccType_ = eeInnerTcc_;
        else{
          cerr << "TCC ID is also invalid. EB- TCC type will be assumed.\n";
          tccType_ = ebmTcc_;
        }
        cerr << flush;
      }
      tccBlockLen64_ = (tccType_==ebmTcc_ || tccType_==ebpTcc_) ? 18 : 9;        
    } else{// if(iTccWord64_<18){
      int tpgOffset = (iTccWord64_-1)*4;
      if(iTcc_ > maxTccsPerDcc_){
        out << "Too many TCC blocks";
      } else if(tpgOffset > (maxTpgsPerTcc_ - 4)){
        out << "Too many TPG in one TCC block";
      } else{
        tpg_[iTcc_-1][3+tpgOffset] = (data[1] >>16) & 0x1FF;
        tpg_[iTcc_-1][2+tpgOffset] = (data[1] >>0 ) & 0x1FF;
        tpg_[iTcc_-1][1+tpgOffset] = (data[0] >>16) & 0x1FF;
        tpg_[iTcc_-1][0+tpgOffset] = (data[0] >>0 ) & 0x1FF;
        //int n[2][4] = {{1,2,3,4},
        //             {4,3,2,1}};
        //int iorder = (628<=fedId_ && fedId_<=645)?1:0;
        if(d) out << ttfTag(tccType_, 3+tpgOffset) << ":" //"TTF# " << setw(2) << ttId_[3 + tpgOffset] << ":"
                  << ((data[1] >>25) & 0x7) << " "
                  << tpgTag(tccType_, 3+tpgOffset) << ":" //" TPG# "<< setw(2) << ttId_[3 + tpgOffset] << ":"
                  << setw(3) << tpg_[iTcc_-1][3+tpgOffset] << " "
                  << ttfTag(tccType_, 2+tpgOffset) << ":" //" TTF# "<< setw(2) << ttId_[2 + tpgOffset] << ":"
                  << ((data[1] >>9 ) & 0x7) << " "
                  << tpgTag(tccType_, 2+tpgOffset) << ":" //" TPG# "<< setw(2) << ttId_[2 + tpgOffset] << ":"
                  << setw(3) << tpg_[iTcc_-1][2+tpgOffset] << " "
                  << " '3': "                     << ((data[0] >>29) & 0x7) << " "
                  << ttfTag(tccType_, 1+tpgOffset) << ":" //" TTF# "<< setw(2) << ttId_[1 + tpgOffset] << ":"
                  << ((data[0] >>25) & 0x7) << " "
                  << setw(3) << tpgTag(tccType_, 1+tpgOffset) << ": "//" TPG# "<< setw(2) << ttId_[1 + tpgOffset] << ":"
                  << tpg_[iTcc_-1][1+tpgOffset] << " "
                  << ttfTag(tccType_, 0+tpgOffset) << ":" //" TTF# "<< setw(2) << ttId_[0 + tpgOffset] << ":"
                  << ((data[0] >>9 ) & 0x7) << " "
                  << setw(3) << tpgTag(tccType_, 0+tpgOffset) << ":" //" TPG# "<< setw(2) << ttId_[0 + tpgOffset] << ":"
                  << tpg_[iTcc_-1][0+tpgOffset];
      }
    }// else{
     // if(d) out << "ERROR";
    //}
    ++iTccWord64_;
    if(iTccWord64_ >= (unsigned)tccBlockLen64_) iTccWord64_ = 0;
  } else if((dataType>>1)==4){//SRP block
    /**********************************************************************
     * SRP block
     *
     **********************************************************************/
    if(iSrWord64_==0){//header
      srpL1a_ = (data[1] >>0 ) & 0xFFF;
      srpBx_ = (data[0] >>16) & 0xFFF;
      if(d) out << "LE1: "     << ((data[1] >>28) & 0x1)
                << " LE0: "    << ((data[1] >>27) & 0x1)
                << " N_SRFs: " << ((data[1] >>16) & 0x7F)
                << " E1: "     << ((data[1] >>12) & 0x1)
                << " L1A: "    << srpL1a_
                << " '4': "    << ((data[0] >>29) & 0x7)
                << " E0: "     << ((data[0] >>28) & 0x1)
                << " Bx: "     << srpBx_
                << " SRP ID: " << ((data[0] >>0 ) & 0xFF);
    } else if(iSrWord64_<6){
      int ttfOffset = (iSrWord64_-1)*16;
      if(d){
        if(iSrWord64_<5){
          out <<"SRF# " << setw(6) << right << srRange(12+ttfOffset)/*16+ttfOffset << "..#" << 13+ttfOffset*/  << ": "
              << oct << ((data[1] >>16) & 0xFFF) << dec
              << " SRF# " << srRange(8+ttfOffset) /*12+ttfOffset << "..#" << 9+ttfOffset*/ << ": "
              << oct << ((data[1] >>0 ) & 0xFFF) << dec
              << " '4':" << ((data[0] >>29) & 0x7)
              << " SRF# " << srRange(4+ttfOffset) /*8+ttfOffset << "..#" << 5+ttfOffset*/ << ": "
              << oct << ((data[0] >>16) & 0xFFF) << dec;
        } else{//last 64-bit word has only 4 SRFs.
          out << "                                                           ";
        }
        out << " SRF# " << srRange(ttfOffset) /*4+ttfOffset << "..#" << 1+ttfOffset*/ << ": "
            << oct << ((data[0] >>0 ) & 0xFFF) << dec;
      }
    } else{
      if(d) out << "ERROR";
    }
    ++iSrWord64_;
  } else if((dataType>>2)==3){//Tower block
    /**********************************************************************
     * "Tower" block (crystal channel data from a RU (=1 FE cards))
     *
     **********************************************************************/
    if(iTowerWord64_==0){//header
      towerBlockLength_ = (data[1]>>16) & 0x1FF;
      int l1a;
      int bx;
      l1a = (data[1] >>0 ) & 0xFFF;
      bx = (data[0] >>16) & 0xFFF;
      dccCh_=(data[0] >>0 ) & 0xFF;
      if(d) out << "Block Len: "  << towerBlockLength_
                << " E1: "        << ((data[1] >>12) & 0x1)
                << " L1A: "       << l1a
                << " '3': "       << ((data[0] >>30) & 0x3)
                << " E0: "        << ((data[0] >>28) & 0x1)
                << " Bx: "        << bx
                << " N_samples: " << ((data[0] >>8 ) & 0x7F)
                << " RU ID: "     << dccCh_;
      if(iRu_ < nRu_){
        feL1a_[iRu_] = l1a;
        feBx_[iRu_] = bx;
        feRuId_[iRu_] = dccCh_;
        ++iRu_;
      }
    } else if((unsigned)iTowerWord64_<towerBlockLength_){
      if(!dumpAdc_){
        //no output.
        rc = false;
      }
      const bool da = dumpAdc_ && dump_;
      switch((iTowerWord64_-1)%3){
        int s[4];
        int g[4];
      case 0:
        s[0]=(data[0] >>16) & 0xFFF;
        g[0]=(data[0] >>28) & 0x3;
        s[1]=(data[1] >>0 ) & 0xFFF;
        g[1]=(data[1] >>12) & 0x3;
        s[2]=(data[1] >>16) & 0xFFF;
        g[2]=(data[1] >>28) & 0x3;
        fill(adc_.begin(), adc_.end(), 0.);
        if(da) out << "GMF: "    << ((data[0] >>11) & 0x1)
                   << " SMF: "   << ((data[0] >>9 ) & 0x1)
                   << " M: "   << ((data[0] >>8 ) & 0x1)
                   << " XTAL: "  << ((data[0] >>4 ) & 0x7)
                   << " STRIP: " << ((data[0] >>0 ) & 0x7)
                   << " " << setw(4) << s[0]
                   << "G" << g[0]
                   << " " << setw(4) << s[1]
                   << "G" << g[1]
                   << " " << setw(4) << s[2]
                   << "G" << g[2];
        for(int i=0; i<3; ++i) adc_[i] = s[i]*mgpaGainFactors[g[i]];
        break;
      case 1:
        s[0]=(data[0] >>0 ) & 0xFFF;
        g[0]=(data[0] >>12) & 0x3;
        s[1]=(data[0] >>16) & 0xFFF;
        g[1]=(data[0] >>28) & 0x3;
        s[2]=(data[1] >>0 ) & 0xFFF;
        g[2]=(data[1] >>12) & 0x3;
        s[3]=(data[1] >>16) & 0xFFF;
        g[3]=(data[1] >>28) & 0x3;
        if(da) out << "                                   "
                   << " " << setw(4) << s[0]
                   << "G" << g[0]
                   << " " << setw(4) << s[1]
                   << "G" << g[1]
                   << " " << setw(4) << s[2]
                   << "G" << g[2]
                   << " " << setw(4) << s[3]
                   << "G" << g[3];
        for(int i=0; i<4; ++i) adc_[i+3] = s[i]*mgpaGainFactors[g[i]];
        break;
      case 2:
        if(da) out << "TZS: " << ((data[1] >>14) & 0x1);

        s[0]=(data[0] >>0 ) & 0xFFF;
        g[0]=(data[0] >>12) & 0x3;
        s[1]=(data[0] >>16) & 0xFFF;
        g[1]=(data[0] >>28) & 0x3;
        s[2]=(data[1] >>0 ) & 0xFFF;
        g[2]=(data[1] >>12) & 0x3  ;

        for(int i=0; i<3; ++i) adc_[i+7] = s[i]*mgpaGainFactors[g[i]];
        if(dccCh_<=68){
          unsigned bom0; //Bin of Maximum, starting counting from 0
          double ampl = max(adc_, bom0)-min(adc_);
          if(da) out << " Ampl: " << setw(4) << ampl
                      << (ampl>amplCut_?"*":" ")
                     << " BoM:" << setw(2) << (bom0+1)
                     << "          ";
            if(fedId_ == dccId_ + 600 //block of the read-out SM
               //if laser, only one side:
               && (detailedTrigType_!=4 || sideOfRu(dccCh_)==(int)side_)
               ){
            }
        } else{
          if(da) out << setw(29) << "";
        }
        if(da) out << " " << setw(4) << s[0]
                   << "G" << g[0]
                   << " " << setw(4) << s[1]
                   << "G" << g[1]
                   << " " << setw(4) << s[2]
                  << "G" << g[2];
        break;
        default:
          assert(false);
      }
    } else {
      if(d) out << "ERROR";
    }
    ++iTowerWord64_;
    if(iTowerWord64_>=towerBlockLength_){
      iTowerWord64_-=towerBlockLength_;
      ++dccCh_;
    }
  } else if(dataType==eoe){//End of event trailer
    /**********************************************************************
     * Event DAQ trailer
     *
     **********************************************************************/
    int tts = (data[0] >>4)  & 0xF;
    if(d) out << "Evt Len.: "    << ((data[1] >>0 ) & 0xFFFFFF)
              << " CRC16: "       << ((data[0] >>16) & 0xFFFF)
              << " Evt Status: "  << ((data[0] >>8 ) & 0xF)
              << " TTS: "         << tts
              << " (" << ttsNames[tts] << ")"
              << " T:"            << ((data[0] >>3)  & 0x1);
  } else{
    if(d) out << " incorrect 64-bit word type marker (see MSBs)";
  }
  return rc;
}
void ESElectronicsSim::digitalToAnalog ( const ESDataFrame df,
CaloSamples cs 
) const [virtual]

Definition at line 35 of file ESElectronicsSim.cc.

References decode(), i, ESDataFrame::id(), and ESDataFrame::size().

{

  for(int i = 0; i < df.size(); i++) {
    cs[i] = decode(df[i], df.id());
  }

}
std::vector< ESSample > ESElectronicsSim::encode ( const CaloSamples timeframe) const [private]

Definition at line 45 of file ESElectronicsSim.cc.

References ecalMGPA::adc(), addNoise_, Exception, ESCondObjectContainer< T >::find(), ESCondObjectContainer< T >::getMap(), i, CaloSamples::id(), edm::Service< T >::isAvailable(), MAXADC, MINADC, mips_, MIPToGeV_, peds_, python::entryComment::results, and CaloSamples::size().

Referenced by analogToDigital().

{
  edm::Service<edm::RandomNumberGenerator> rng;
  if ( ! rng.isAvailable()) {
    throw cms::Exception("Configuration")
      << "ESElectroncSim requires the RandomNumberGeneratorService\n"
      "which is not present in the configuration file.  You must add the service\n"
      "in the configuration file or remove the modules that require it.";
  }


  std::vector<ESSample> results;
  results.reserve(timeframe.size());

  ESPedestals::const_iterator it_ped = peds_->find(timeframe.id());
  ESIntercalibConstantMap::const_iterator it_mip = mips_->getMap().find(timeframe.id());
  int baseline_  = (int) it_ped->getMean();
  double sigma_  = (double) it_ped->getRms();
  double MIPADC_ = (double) (*it_mip);

  int adc = 0; 
  double ADCGeV = MIPADC_/MIPToGeV_;

  for (int i=0; i<timeframe.size(); i++) {

    double noi = 0;
    double signal = 0;    

    if (addNoise_) {
      CLHEP::RandGaussQ gaussQDistribution(rng->getEngine(), 0., sigma_);
      noi = gaussQDistribution.fire();
    }

    signal = timeframe[i]*ADCGeV + noi + baseline_;
    
    if (signal>0) 
      signal += 0.5;
    else if (signal<0)
      signal -= 0.5;
    
    adc = int(signal);

    if (adc>MAXADC) adc = MAXADC;
    if (adc<MINADC) adc = MINADC;

    results.emplace_back(adc);
  }

  return results;
}
void ESElectronicsSim::newEvent ( ) [inline]

anything that needs to be done once per event

Definition at line 31 of file ESElectronicsSim.h.

{}
void ESElectronicsSim::setGain ( const int  gain) [inline]

Definition at line 22 of file ESElectronicsSim.h.

References gain_.

Referenced by EcalDigiProducer::checkCalibrations().

{ gain_ = gain; }
void ESElectronicsSim::setMIPs ( const ESIntercalibConstants mips) [inline]

Definition at line 24 of file ESElectronicsSim.h.

References mips_.

Referenced by EcalDigiProducer::checkCalibrations().

{ mips_ = mips; }
void ESElectronicsSim::setMIPToGeV ( const double  MIPToGeV) [inline]

Definition at line 25 of file ESElectronicsSim.h.

References MIPToGeV_.

Referenced by EcalDigiProducer::checkCalibrations().

{ MIPToGeV_ = MIPToGeV; }
void ESElectronicsSim::setPedestals ( const ESPedestals peds) [inline]

Definition at line 23 of file ESElectronicsSim.h.

References peds_.

Referenced by EcalDigiProducer::checkCalibrations().

{ peds_ = peds; }

Member Data Documentation

Definition at line 35 of file ESElectronicsSim.h.

Referenced by encode().

int ESElectronicsSim::gain_ [private]

Definition at line 36 of file ESElectronicsSim.h.

Referenced by setGain().

Definition at line 38 of file ESElectronicsSim.h.

Referenced by encode(), and setMIPs().

double ESElectronicsSim::MIPToGeV_ [private]

Definition at line 39 of file ESElectronicsSim.h.

Referenced by encode(), and setMIPToGeV().

Definition at line 37 of file ESElectronicsSim.h.

Referenced by encode(), and setPedestals().