Go to the documentation of this file.00001 #include "FWCore/PluginManager/interface/PluginManager.h"
00002
00003 #include "SimCalorimetry/HcalTestBeam/interface/HcalTBDigiProducer.h"
00004 #include "DataFormats/Common/interface/Handle.h"
00005 #include "FWCore/Framework/interface/ESHandle.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007
00008 #include "SimCalorimetry/CaloSimAlgos/interface/CaloTDigitizer.h"
00009 #include "SimCalorimetry/CaloSimAlgos/interface/CaloShapeIntegrator.h"
00010 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00011 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00012 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00013 #include "CalibFormats/HcalObjects/interface/HcalDbService.h"
00014 #include "CalibFormats/HcalObjects/interface/HcalDbRecord.h"
00015 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h"
00016 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
00017 #include "SimDataFormats/EcalTestBeam/interface/PEcalTBInfo.h"
00018
00019 HcalTBDigiProducer::HcalTBDigiProducer(const edm::ParameterSet& ps) :
00020 theParameterMap(new HcalTBSimParameterMap(ps)),
00021 theHcalShape(new HcalShape()),
00022 theHcalIntegratedShape(new CaloShapeIntegrator(theHcalShape)),
00023 theHBHEResponse(new CaloHitResponse(theParameterMap, theHcalIntegratedShape)),
00024 theHOResponse(new CaloHitResponse(theParameterMap, theHcalIntegratedShape)),
00025 theAmplifier(0), theCoderFactory(0), theElectronicsSim(0),
00026 theHitCorrection(0), theHBHEDigitizer(0), theHODigitizer(0), theHBHEHits(),
00027 theHOHits(), thisPhaseShift(0) {
00028
00029 produces<HBHEDigiCollection>();
00030 produces<HODigiCollection>();
00031
00032 DetId detId(DetId::Hcal, 1);
00033 bool syncPhase = (theParameterMap->simParameters(detId)).syncPhase();
00034 doPhaseShift = !syncPhase;
00035
00036 theHBHEResponse->setHitFilter(&theHBHEHitFilter);
00037 theHOResponse->setHitFilter(&theHOHitFilter);
00038
00039 bool doTimeSlew = ps.getParameter<bool>("doTimeSlew");
00040 if(doTimeSlew) {
00041
00042 theHitCorrection = new HcalHitCorrection(theParameterMap);
00043 theHBHEResponse->setHitCorrection(theHitCorrection);
00044 theHOResponse->setHitCorrection(theHitCorrection);
00045 }
00046
00047 bool doNoise = ps.getParameter<bool>("doNoise");
00048 theAmplifier = new HcalAmplifier(theParameterMap, doNoise);
00049 theCoderFactory = new HcalCoderFactory(HcalCoderFactory::DB);
00050 theElectronicsSim = new HcalElectronicsSim(theAmplifier, theCoderFactory);
00051
00052 theHBHEDigitizer = new HBHEDigitizer(theHBHEResponse, theElectronicsSim, doNoise);
00053 theHODigitizer = new HODigitizer(theHOResponse, theElectronicsSim, doNoise);
00054
00055 tunePhaseShift = ps.getUntrackedParameter<double>("tunePhaseShiftTB", 1.);
00056 ecalTBInfoLabel = ps.getUntrackedParameter<std::string>("EcalTBInfoLabel","SimEcalTBG4Object");
00057 edm::LogInfo("HcalSim") << "HcalTBDigiProducer initialized with doNoise = "
00058 << doNoise << ", doTimeSlew = " << doTimeSlew
00059 << " and doPhaseShift = " << doPhaseShift
00060 << " tunePhasShift = " << tunePhaseShift;
00061
00062 }
00063
00064 HcalTBDigiProducer::~HcalTBDigiProducer() {
00065
00066 if (theHBHEDigitizer) delete theHBHEDigitizer;
00067 if (theHODigitizer) delete theHODigitizer;
00068 if (theParameterMap) delete theParameterMap;
00069 if (theHcalShape) delete theHcalShape;
00070 if (theHcalIntegratedShape) delete theHcalIntegratedShape;
00071 if (theHBHEResponse) delete theHBHEResponse;
00072 if (theHOResponse) delete theHOResponse;
00073 if (theElectronicsSim) delete theElectronicsSim;
00074 if (theAmplifier) delete theAmplifier;
00075 if (theCoderFactory) delete theCoderFactory;
00076 if (theHitCorrection) delete theHitCorrection;
00077 }
00078
00079
00080 void HcalTBDigiProducer::produce(edm::Event& e, const edm::EventSetup& eventSetup) {
00081
00082
00083 edm::ESHandle<HcalDbService> conditions;
00084 eventSetup.get<HcalDbRecord>().get(conditions);
00085 theAmplifier->setDbService(conditions.product());
00086 theCoderFactory->setDbService(conditions.product());
00087
00088
00089 checkGeometry(eventSetup);
00090
00091 theHBHEHits.clear();
00092 theHOHits.clear();
00093
00094
00095 edm::Handle<CrossingFrame<PCaloHit> > cf;
00096
00097
00098 LogDebug("HcalSim") << "HcalTBDigiProducer::produce trying to ger SimHit";
00099
00100 const std::string subdet("HcalHits");
00101
00102 e.getByLabel("mix", subdet, cf);
00103 std::auto_ptr<MixCollection<PCaloHit> > col(new MixCollection<PCaloHit>(cf.product() ));
00104
00105 LogDebug("HcalSim") << "HcalTBDigiProducer::produce Collection of SimHit found";
00106 if(theHitCorrection != 0) {
00107 theHitCorrection->fillChargeSums(*col);
00108 }
00109 LogDebug("HcalSim") << "HcalTBDigiProducer::produce Hits corrected";
00110
00111
00112 std::auto_ptr<HBHEDigiCollection> hbheResult(new HBHEDigiCollection());
00113 std::auto_ptr<HODigiCollection> hoResult(new HODigiCollection());
00114 LogDebug("HcalSim") << "HcalTBDigiProducer::produce Empty collection created";
00115 if (doPhaseShift) {
00116
00117 edm::Handle<PEcalTBInfo> theEcalTBInfo;
00118 e.getByLabel(ecalTBInfoLabel,theEcalTBInfo);
00119 thisPhaseShift = theEcalTBInfo->phaseShift();
00120
00121 DetId detIdHB(DetId::Hcal, 1);
00122 setPhaseShift(detIdHB);
00123 DetId detIdHO(DetId::Hcal, 3);
00124 setPhaseShift(detIdHO);
00125 }
00126
00127
00128 theHBHEDigitizer->run(*col, *hbheResult);
00129 edm::LogInfo("HcalSim") << "HcalTBDigiProducer: HBHE digis : " << hbheResult->size();
00130 theHODigitizer->run(*col, *hoResult);
00131 edm::LogInfo("HcalSim") << "HcalTBDigiProducer: HO digis : " << hoResult->size();
00132
00133
00134 e.put(hbheResult);
00135 e.put(hoResult);
00136
00137 }
00138
00139 void HcalTBDigiProducer::sortHits(const edm::PCaloHitContainer & hits) {
00140
00141 for (edm::PCaloHitContainer::const_iterator hitItr = hits.begin();
00142 hitItr != hits.end(); ++hitItr) {
00143 HcalSubdetector subdet = HcalDetId(hitItr->id()).subdet();
00144 if(subdet == HcalBarrel || subdet == HcalEndcap) {
00145 theHBHEHits.push_back(*hitItr);
00146 } else if(subdet == HcalOuter) {
00147 theHOHits.push_back(*hitItr);
00148 } else {
00149 edm::LogError("HcalSim") << "Bad HcalHit subdetector " << subdet;
00150 }
00151 }
00152 }
00153
00154 void HcalTBDigiProducer::checkGeometry(const edm::EventSetup & eventSetup) {
00155
00156
00157 edm::ESHandle<CaloGeometry> geometry;
00158 eventSetup.get<CaloGeometryRecord>().get(geometry);
00159
00160 const CaloGeometry * pGeometry = &*geometry;
00161
00162
00163 if(pGeometry != theGeometry) {
00164 theGeometry = pGeometry;
00165 updateGeometry();
00166 }
00167 }
00168
00169 void HcalTBDigiProducer::updateGeometry() {
00170
00171 theHBHEResponse->setGeometry(theGeometry);
00172 theHOResponse->setGeometry(theGeometry);
00173
00174
00175 hbheCells.clear();
00176 hbheCells = theGeometry->getValidDetIds(DetId::Hcal, HcalBarrel);
00177 std::vector<DetId> heCells = theGeometry->getValidDetIds(DetId::Hcal, HcalEndcap);
00178
00179 hbheCells.insert(hbheCells.end(), heCells.begin(), heCells.end());
00180
00181
00182 hoCells.clear();
00183 hoCells = theGeometry->getValidDetIds(DetId::Hcal, HcalOuter);
00184
00185 edm::LogInfo("HcalSim") << "HcalTBDigiProducer update Geometry with "
00186 << hbheCells.size() << " cells in HB/HE and "
00187 << hoCells.size() << " cells in HO";
00188
00189 theHBHEDigitizer->setDetIds(hbheCells);
00190 LogDebug("HcalSim") << "HcalTBDigiProducer: Set DetID's for HB/HE";
00191 theHODigitizer->setDetIds(hoCells);
00192 LogDebug("HcalSim") << "HcalTBDigiProducer: Set DetID's for HO";
00193 }
00194
00195 void HcalTBDigiProducer::setPhaseShift(const DetId & detId) {
00196
00197 const CaloSimParameters & parameters = theParameterMap->simParameters(detId);
00198 if ( !parameters.syncPhase() ) {
00199 int myDet = detId.subdetId();
00200 double passPhaseShift = thisPhaseShift + tunePhaseShift;
00201 if (myDet <= 2) {
00202 theHBHEResponse->setPhaseShift(passPhaseShift);
00203 } else {
00204 theHOResponse->setPhaseShift(passPhaseShift);
00205 }
00206 }
00207 }