Go to the documentation of this file.00001
00002 #include "SimCalorimetry/EcalTestBeam/interface/EcalTBDigiProducer.h"
00003 #include "DataFormats/Common/interface/EDProduct.h"
00004 #include "FWCore/Framework/interface/ESHandle.h"
00005 #include "DataFormats/Common/interface/Handle.h"
00006 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 #include "DataFormats/Provenance/interface/Provenance.h"
00009 #include "SimDataFormats/EcalTestBeam/interface/PEcalTBInfo.h"
00010 #include "SimDataFormats/CaloHit/interface/PCaloHitContainer.h"
00011 #include "SimCalorimetry/CaloSimAlgos/interface/CaloDigiCollectionSorter.h"
00012 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00013 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00014 #include "CondFormats/EcalObjects/interface/EcalPedestals.h"
00015 #include "CondFormats/DataRecord/interface/EcalPedestalsRcd.h"
00016 #include "CondFormats/EcalObjects/interface/EcalIntercalibConstantsMC.h"
00017 #include "CondFormats/DataRecord/interface/EcalIntercalibConstantsMCRcd.h"
00018 #include "CondFormats/EcalObjects/interface/EcalADCToGeVConstant.h"
00019 #include "CondFormats/DataRecord/interface/EcalADCToGeVConstantRcd.h"
00020 #include "CondFormats/EcalObjects/interface/EcalGainRatios.h"
00021 #include "CondFormats/DataRecord/interface/EcalGainRatiosRcd.h"
00022
00023
00024 EcalTBDigiProducer::EcalTBDigiProducer(const edm::ParameterSet& params)
00025 {
00026
00028
00029 EBdigiCollection_ = params.getParameter<std::string>("EBdigiCollection");
00030 EEdigiCollection_ = params.getParameter<std::string>("EEdigiCollection");
00031
00032 const std::string hitsProducer (
00033 params.getParameter<std::string>("hitsProducer") ) ;
00034
00035 m_barrelHitsName = hitsProducer + "EcalHitsEB" ;
00036 m_endcapHitsName = hitsProducer + "EcalHitsEE" ;
00037
00038 produces<EBDigiCollection>( EBdigiCollection_ );
00039 produces<EEDigiCollection>( EEdigiCollection_ );
00040
00041 produces<EcalTBTDCRawInfo>();
00042
00043
00044
00045 bool addNoise = params.getParameter<bool>("doNoise");
00046 double simHitToPhotoelectronsBarrel = params.getParameter<double>("simHitToPhotoelectronsBarrel");
00047 double simHitToPhotoelectronsEndcap = params.getParameter<double>("simHitToPhotoelectronsEndcap");
00048 double photoelectronsToAnalogBarrel = params.getParameter<double>("photoelectronsToAnalogBarrel");
00049 double photoelectronsToAnalogEndcap = params.getParameter<double>("photoelectronsToAnalogEndcap");
00050 double samplingFactor = params.getParameter<double>("samplingFactor");
00051 double timePhase = params.getParameter<double>("timePhase");
00052 int readoutFrameSize = params.getParameter<int>("readoutFrameSize");
00053 int binOfMaximum = params.getParameter<int>("binOfMaximum");
00054 bool doPhotostatistics = params.getParameter<bool>("doPhotostatistics");
00055 bool syncPhase = params.getParameter<bool>("syncPhase");
00056
00057
00058
00059 doPhaseShift = !syncPhase;
00060 thisPhaseShift = 1.;
00061
00062 theParameterMap = new EcalSimParameterMap(simHitToPhotoelectronsBarrel, simHitToPhotoelectronsEndcap,
00063 photoelectronsToAnalogBarrel, photoelectronsToAnalogEndcap,
00064 samplingFactor, timePhase, readoutFrameSize, binOfMaximum,
00065 doPhotostatistics, syncPhase);
00066
00067
00068 theEBResponse = new CaloHitRespoNew(theParameterMap, &theEBShape);
00069 theEEResponse = new CaloHitRespoNew(theParameterMap, &theEEShape);
00070
00071 EcalCorrMatrix thisMatrix;
00072
00073 std::vector<double> corrNoiseMatrix = params.getParameter< std::vector<double> >("CorrelatedNoiseMatrix");
00074 if ( corrNoiseMatrix.size() == (unsigned int)(readoutFrameSize*readoutFrameSize) ) {
00075 for ( int row = 0 ; row < readoutFrameSize; ++row ) {
00076 for ( int column = 0 ; column < readoutFrameSize; ++column ) {
00077 int index = column + readoutFrameSize*row;
00078 thisMatrix(row,column) = corrNoiseMatrix[index];
00079 }
00080 }
00081 }
00082 theNoiseMatrix = new EcalCorrMatrix(thisMatrix);
00083
00084 theCorrNoise = new CorrelatedNoisifier<EcalCorrMatrix>(thisMatrix);
00085
00086 theCoder = new EcalCoder(addNoise, theCorrNoise);
00087 bool applyConstantTerm = params.getParameter<bool>("applyConstantTerm");
00088 double rmsConstantTerm = params.getParameter<double> ("ConstantTerm");
00089 theElectronicsSim = new EcalElectronicsSim(theParameterMap, theCoder, applyConstantTerm, rmsConstantTerm);
00090
00091
00092 theBarrelDigitizer = new EBDigitizer( theEBResponse,
00093 theElectronicsSim,
00094 addNoise );
00095
00096 theEndcapDigitizer = new EEDigitizer( theEEResponse,
00097 theElectronicsSim,
00098 addNoise );
00099
00100
00101
00102 EBs25notCont = params.getParameter<double>("EBs25notContainment");
00103 EEs25notCont = params.getParameter<double>("EEs25notContainment");
00104
00105
00106
00108
00109 typedef std::vector< edm::ParameterSet > Parameters;
00110 Parameters ranges=params.getParameter<Parameters>("tdcRanges");
00111 for(Parameters::iterator itRanges = ranges.begin(); itRanges != ranges.end(); ++itRanges)
00112 {
00113 EcalTBTDCRecInfoAlgo::EcalTBTDCRanges aRange;
00114 aRange.runRanges.first = itRanges->getParameter<int>("startRun");
00115 aRange.runRanges.second = itRanges->getParameter<int>("endRun");
00116 aRange.tdcMin = itRanges->getParameter< std::vector<double> >("tdcMin");
00117 aRange.tdcMax = itRanges->getParameter< std::vector<double> >("tdcMax");
00118 tdcRanges.push_back(aRange);
00119 }
00120
00121 use2004OffsetConvention_ = params.getUntrackedParameter< bool >("use2004OffsetConvention",false);
00122
00123 ecalTBInfoLabel = params.getUntrackedParameter<std::string>("EcalTBInfoLabel","SimEcalTBG4Object");
00124 doReadout = params.getParameter<bool>("doReadout");
00125
00126 theTBReadout = new EcalTBReadout(ecalTBInfoLabel);
00127
00128 tunePhaseShift = params.getParameter<double>("tunePhaseShift");
00129
00130
00131 }
00132
00133
00134 EcalTBDigiProducer::~EcalTBDigiProducer()
00135 {
00136 if (theParameterMap) { delete theParameterMap; }
00137 if (theEBResponse) { delete theEBResponse; }
00138 if (theEEResponse) { delete theEEResponse; }
00139 if (theCorrNoise) { delete theCorrNoise; }
00140 if (theNoiseMatrix) { delete theNoiseMatrix; }
00141 if (theCoder) { delete theCoder; }
00142 if (theElectronicsSim){ delete theElectronicsSim; }
00143 if (theBarrelDigitizer){ delete theBarrelDigitizer; }
00144 if (theEndcapDigitizer){ delete theEndcapDigitizer; }
00145 }
00146
00147 void EcalTBDigiProducer::produce( edm::Event& event ,
00148 const edm::EventSetup& eventSetup )
00149 {
00150
00151
00152
00153 edm::ESHandle<CaloGeometry> hGeometry ;
00154 eventSetup.get<CaloGeometryRecord>().get( hGeometry ) ;
00155 theEBResponse->setGeometry(
00156 hGeometry->getSubdetectorGeometry( DetId::Ecal, EcalBarrel ) ) ;
00157 theEEResponse->setGeometry(
00158 hGeometry->getSubdetectorGeometry( DetId::Ecal, EcalEndcap ) ) ;
00159
00160
00161 const std::vector<DetId>& theBarrelDets (
00162 hGeometry->getValidDetIds(DetId::Ecal, EcalBarrel) ) ;
00163
00164
00165
00166
00167
00168 theTBReadout ->setDetIds( theBarrelDets ) ;
00169
00170
00171
00172 checkCalibrations(eventSetup);
00173
00174
00175 edm::Handle<CrossingFrame<PCaloHit> > crossingFrame;
00176 event.getByLabel( "mix", m_barrelHitsName, crossingFrame ) ;
00177
00178 MixCollection<PCaloHit>* EBHits ( crossingFrame.isValid() ?
00179 new MixCollection<PCaloHit>( crossingFrame.product() ) : 0 ) ;
00180
00181 const bool isEB ( 0 != EBHits &&
00182 0 != EBHits->size() ) ;
00183
00184 event.getByLabel( "mix", m_endcapHitsName, crossingFrame ) ;
00185 MixCollection<PCaloHit>* EEHits ( crossingFrame.isValid() ?
00186 new MixCollection<PCaloHit>( crossingFrame.product() ) : 0 ) ;
00187
00188 const bool isEE ( 0 != EEHits &&
00189 0 != EEHits->size() ) ;
00190
00191
00192 std::auto_ptr<EcalTBTDCRawInfo> TDCproduct(new EcalTBTDCRawInfo(1));
00193 if( doPhaseShift )
00194 {
00195 edm::Handle<PEcalTBInfo> theEcalTBInfo ;
00196 event.getByLabel( ecalTBInfoLabel, theEcalTBInfo ) ;
00197 thisPhaseShift = theEcalTBInfo->phaseShift();
00198
00199 DetId detId( DetId::Ecal, 1 ) ;
00200 setPhaseShift( detId );
00201
00202 fillTBTDCRawInfo( *TDCproduct ) ;
00203
00204 }
00205
00206
00207
00208 std::auto_ptr<EBDigiCollection> barrelResult( new EBDigiCollection() ) ;
00209 std::auto_ptr<EEDigiCollection> endcapResult( new EEDigiCollection() ) ;
00210
00211 if ( isEB )
00212 {
00213 std::auto_ptr<MixCollection<PCaloHit> > barrelHits( EBHits );
00214 theBarrelDigitizer->run( *barrelHits, *barrelResult ) ;
00215 edm::LogInfo("DigiInfo") << "EB Digis: " << barrelResult->size();
00216 std::cout << "EB Digis: " << barrelResult->size()<<std::endl;
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 }
00232
00233 if( isEE )
00234 {
00235 std::auto_ptr<MixCollection<PCaloHit> > endcapHits( EEHits );
00236 theEndcapDigitizer->run( *endcapHits, *endcapResult ) ;
00237 edm::LogInfo("EcalDigi") << "EE Digis: " << endcapResult->size();
00238 std::cout << "EE Digis: " << endcapResult->size()<<std::endl;
00239 }
00240
00241
00242
00243
00244
00245 std::auto_ptr<EBDigiCollection> barrelReadout( new EBDigiCollection() ) ;
00246 if ( doReadout )
00247 {
00248 theTBReadout->performReadout( event,
00249 *theTTmap,
00250 *barrelResult,
00251 *barrelReadout);
00252 }
00253 else
00254 {
00255 barrelResult->swap(*barrelReadout);
00256 }
00257
00258
00259
00260 event.put( barrelReadout, EBdigiCollection_ ) ;
00261 event.put( endcapResult, EEdigiCollection_ ) ;
00262 event.put( TDCproduct ) ;
00263
00264
00265 }
00266
00267
00268 void EcalTBDigiProducer::checkCalibrations(const edm::EventSetup & eventSetup)
00269 {
00270
00271
00272
00273 edm::ESHandle<EcalPedestals> dbPed;
00274 eventSetup.get<EcalPedestalsRcd>().get( dbPed );
00275 const EcalPedestals* thePedestals=dbPed.product();
00276
00277 theCoder->setPedestals( thePedestals );
00278
00279
00280 edm::ESHandle<EcalIntercalibConstantsMC> pIcal;
00281 eventSetup.get<EcalIntercalibConstantsMCRcd>().get(pIcal);
00282 const EcalIntercalibConstantsMC *ical = pIcal.product();
00283
00284 theCoder->setIntercalibConstants( ical );
00285
00286
00287 edm::ESHandle<EcalADCToGeVConstant> pAgc;
00288 eventSetup.get<EcalADCToGeVConstantRcd>().get(pAgc);
00289 const EcalADCToGeVConstant* agc = pAgc.product();
00290
00291
00292 edm::ESHandle<EcalGainRatios> pRatio;
00293 eventSetup.get<EcalGainRatiosRcd>().get(pRatio);
00294 const EcalGainRatios* gr = pRatio.product();
00295
00296 theCoder->setGainRatios( gr );
00297
00298 EcalMGPAGainRatio * defaultRatios = new EcalMGPAGainRatio();
00299
00300 double theGains[theCoder->NGAINS+1];
00301 theGains[0] = 0.;
00302 theGains[3] = 1.;
00303 theGains[2] = defaultRatios->gain6Over1() ;
00304 theGains[1] = theGains[2]*(defaultRatios->gain12Over6()) ;
00305
00306 LogDebug("EcalDigi") << " Gains: " << "\n" << " g1 = " << theGains[1] << "\n" << " g2 = " << theGains[2] << "\n" << " g3 = " << theGains[3];
00307
00308 delete defaultRatios;
00309
00310 const double EBscale = (agc->getEBValue())*theGains[1]*(theCoder->MAXADC)*EBs25notCont;
00311 LogDebug("EcalDigi") << " GeV/ADC = " << agc->getEBValue() << "\n" << " notCont = " << EBs25notCont << "\n" << " saturation for EB = " << EBscale << ", " << EBs25notCont;
00312 const double EEscale = (agc->getEEValue())*theGains[1]*(theCoder->MAXADC)*EEs25notCont;
00313 LogDebug("EcalDigi") << " GeV/ADC = " << agc->getEEValue() << "\n" << " notCont = " << EEs25notCont << "\n" << " saturation for EB = " << EEscale << ", " << EEs25notCont;
00314 theCoder->setFullScaleEnergy( EBscale , EEscale );
00315
00316 }
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357 void EcalTBDigiProducer::setPhaseShift(const DetId & detId) {
00358
00359 const CaloSimParameters & parameters = theParameterMap->simParameters(detId);
00360 if ( !parameters.syncPhase() ) {
00361
00362 int myDet = detId.subdetId();
00363
00364 LogDebug("EcalDigi") << "Setting the phase shift " << thisPhaseShift << " and the offset " << tunePhaseShift << " for the subdetector " << myDet;
00365
00366 if ( myDet == 1) {
00367 double passPhaseShift = thisPhaseShift+tunePhaseShift;
00368 if ( use2004OffsetConvention_ ) passPhaseShift = 1.-passPhaseShift;
00369 theEBResponse->setPhaseShift(passPhaseShift);
00370 theEEResponse->setPhaseShift(passPhaseShift);
00371 }
00372
00373 }
00374
00375 }
00376
00377 void EcalTBDigiProducer::fillTBTDCRawInfo(EcalTBTDCRawInfo & theTBTDCRawInfo) {
00378
00379 unsigned int thisChannel = 1;
00380
00381 unsigned int thisCount = (unsigned int)(thisPhaseShift*(tdcRanges[0].tdcMax[0]-tdcRanges[0].tdcMin[0]) + tdcRanges[0].tdcMin[0]);
00382
00383 EcalTBTDCSample theTBTDCSample(thisChannel, thisCount);
00384
00385 unsigned int sampleIndex = 0;
00386 theTBTDCRawInfo.setSample(sampleIndex, theTBTDCSample);
00387
00388 LogDebug("EcalDigi") << theTBTDCSample << "\n" << theTBTDCRawInfo;
00389
00390 }
00391