Go to the documentation of this file.00001 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00002 #include "FWCore/Framework/interface/Event.h"
00003 #include "FWCore/Framework/interface/MakerMacros.h"
00004 #include "FWCore/ServiceRegistry/interface/Service.h"
00005 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00006 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
00007 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00008 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
00009 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00010 #include "FastSimulation/CaloRecHitsProducer/interface/CaloRecHitsProducer.h"
00011 #include "FastSimulation/CaloRecHitsProducer/interface/HcalRecHitsMaker.h"
00012 #include "FastSimulation/CaloRecHitsProducer/interface/EcalBarrelRecHitsMaker.h"
00013 #include "FastSimulation/CaloRecHitsProducer/interface/EcalEndcapRecHitsMaker.h"
00014 #include "FastSimulation/CaloRecHitsProducer/interface/EcalPreshowerRecHitsMaker.h"
00015
00016
00017 #include "FastSimulation/Utilities/interface/RandomEngine.h"
00018
00019
00020
00021 CaloRecHitsProducer::CaloRecHitsProducer(edm::ParameterSet const & p)
00022 : EcalPreshowerRecHitsMaker_(NULL),EcalBarrelRecHitsMaker_(NULL), EcalEndcapRecHitsMaker_(NULL), HcalRecHitsMaker_(NULL)
00023 {
00024
00025
00026 edm::Service<edm::RandomNumberGenerator> rng;
00027 if ( ! rng.isAvailable() ) {
00028 throw cms::Exception("Configuration")
00029 << "CaloRecHitsProducer requires the RandomGeneratorService\n"
00030 "which is not present in the configuration file.\n"
00031 "You must add the service in the configuration file\n"
00032 "or remove the module that requires it";
00033 }
00034 random = new RandomEngine(&(*rng));
00035 theInputRecHitCollectionTypes = p.getParameter<std::vector<unsigned> >("InputRecHitCollectionTypes");
00036 theOutputRecHitCollections = p.getParameter<std::vector<std::string> >("OutputRecHitCollections");
00037 doDigis_ = p.getParameter<bool>("doDigis");
00038 doMiscalib_ = p.getParameter<bool>("doMiscalib");
00039 edm::ParameterSet RecHitsParameters = p.getParameter<edm::ParameterSet>("RecHitsFactory");
00040
00041 for ( unsigned input=0; input<theInputRecHitCollectionTypes.size(); ++input ) {
00042
00043 switch ( theInputRecHitCollectionTypes[input] ) {
00044
00045 case 1:
00046 {
00047
00048 if (theOutputRecHitCollections.size()&&theOutputRecHitCollections[input].size())
00049 produces<ESRecHitCollection>(theOutputRecHitCollections[input]);
00050 else
00051 produces<ESRecHitCollection>();
00052
00053 if (doDigis_)
00054 std::cout << " The digitization of the preshower is not implemented " << std::endl;
00055
00056 EcalPreshowerRecHitsMaker_ = new EcalPreshowerRecHitsMaker(RecHitsParameters,random);
00057 }
00058 break;
00059
00060 case 2:
00061 {
00062
00063 if (theOutputRecHitCollections.size()&&theOutputRecHitCollections[input].size())
00064 produces<EBRecHitCollection>(theOutputRecHitCollections[input]);
00065 else
00066 produces<EBRecHitCollection>();
00067
00068 if (doDigis_) produces<EBDigiCollection>();
00069 EcalBarrelRecHitsMaker_ = new EcalBarrelRecHitsMaker(RecHitsParameters,random);
00070 }
00071 break;
00072
00073 case 3:
00074 {
00075
00076 if (theOutputRecHitCollections.size()&&theOutputRecHitCollections[input].size())
00077 produces<EERecHitCollection>(theOutputRecHitCollections[input]);
00078 else
00079 produces<EERecHitCollection>();
00080 if (doDigis_) produces<EEDigiCollection>();
00081 EcalEndcapRecHitsMaker_ = new EcalEndcapRecHitsMaker(RecHitsParameters,random);
00082 }
00083 break;
00084
00085 case 4:
00086 {
00087
00088 if (theOutputRecHitCollections.size()&&theOutputRecHitCollections[input].size())
00089 produces<HBHERecHitCollection>(theOutputRecHitCollections[input]);
00090 else
00091 produces<HBHERecHitCollection>();
00092
00093 if (doDigis_) produces<HBHEDigiCollection>();
00094 HcalRecHitsMaker_ = new HcalRecHitsMaker(RecHitsParameters,4,random);
00095 }
00096 break;
00097
00098 case 5:
00099 {
00100
00101 if (theOutputRecHitCollections.size()&&theOutputRecHitCollections[input].size())
00102 produces<HORecHitCollection>(theOutputRecHitCollections[input]);
00103 else
00104 produces<HORecHitCollection>();
00105
00106 if (doDigis_) produces<HODigiCollection>();
00107
00108 HcalRecHitsMaker_ = new HcalRecHitsMaker(RecHitsParameters,5,random);
00109 }
00110 break;
00111
00112 case 6:
00113 {
00114
00115 if (theOutputRecHitCollections.size()&&theOutputRecHitCollections[input].size())
00116 produces<HFRecHitCollection>(theOutputRecHitCollections[input]);
00117 else
00118 produces<HFRecHitCollection>();
00119 if(doDigis_) produces<HFDigiCollection>();
00120
00121 HcalRecHitsMaker_ = new HcalRecHitsMaker(RecHitsParameters,6,random);
00122 }
00123 break;
00124
00125 default:
00126
00127 break;
00128
00129 }
00130
00131 }
00132
00133 }
00134
00135 CaloRecHitsProducer::~CaloRecHitsProducer()
00136 {
00137 if ( random ) {
00138 delete random;
00139 }
00140 }
00141
00142 void
00143 CaloRecHitsProducer::beginRun(edm::Run & run, const edm::EventSetup & es) {
00144
00145 for ( unsigned input=0; input<theInputRecHitCollectionTypes.size(); ++input ) {
00146 switch ( theInputRecHitCollectionTypes[input] ) {
00147 case 1:
00148 {
00149
00150 EcalPreshowerRecHitsMaker_->init(es);
00151 }
00152 break;
00153 case 2:
00154 {
00155
00156 EcalBarrelRecHitsMaker_->init(es,doDigis_,doMiscalib_);
00157 }
00158 break;
00159 case 3:
00160 {
00161
00162 EcalEndcapRecHitsMaker_->init(es,doDigis_,doMiscalib_);
00163 }
00164 break;
00165 case 4:
00166 case 5:
00167 case 6:
00168 {
00169 HcalRecHitsMaker_->init(es,doDigis_,doMiscalib_);
00170 }
00171 break;
00172 default:
00173 break;
00174 }
00175 }
00176 }
00177
00178 void CaloRecHitsProducer::endJob()
00179 {
00180
00181 if (EcalBarrelRecHitsMaker_) delete EcalBarrelRecHitsMaker_;
00182 if (EcalEndcapRecHitsMaker_) delete EcalEndcapRecHitsMaker_;
00183 if (EcalPreshowerRecHitsMaker_) delete EcalPreshowerRecHitsMaker_;
00184 if (HcalRecHitsMaker_) delete HcalRecHitsMaker_;
00185 }
00186
00187 void CaloRecHitsProducer::produce(edm::Event & iEvent, const edm::EventSetup & es)
00188 {
00189
00190
00191
00192 for ( unsigned input=0; input<theInputRecHitCollectionTypes.size(); ++input ) {
00193 switch ( theInputRecHitCollectionTypes[input] ) {
00194 case 1:
00195 {
00196
00197 std::auto_ptr<ESRecHitCollection> reces(new ESRecHitCollection);
00198 EcalPreshowerRecHitsMaker_->loadEcalPreshowerRecHits(iEvent,*reces);
00199 if ( theOutputRecHitCollections.size()&& theOutputRecHitCollections[input].size())
00200 iEvent.put(reces,theOutputRecHitCollections[input]);
00201 else
00202 iEvent.put(reces);
00203 break;
00204 }
00205
00206 case 2:
00207 {
00208
00209 std::auto_ptr<EBRecHitCollection> receb(new EBRecHitCollection);
00210 std::auto_ptr<EBDigiCollection> digieb(new EBDigiCollection(1));
00211 EcalBarrelRecHitsMaker_->loadEcalBarrelRecHits(iEvent,*receb,*digieb);
00212
00213 if ( theOutputRecHitCollections.size()&&theOutputRecHitCollections[input].size())
00214 iEvent.put(receb,theOutputRecHitCollections[input]);
00215 else
00216 iEvent.put(receb);
00217
00218 if(doDigis_)
00219 iEvent.put(digieb);
00220 }
00221 break;
00222 case 3:
00223 {
00224
00225 std::auto_ptr<EERecHitCollection> recee(new EERecHitCollection);
00226 std::auto_ptr<EEDigiCollection> digiee(new EEDigiCollection(1));
00227 EcalEndcapRecHitsMaker_->loadEcalEndcapRecHits(iEvent,*recee,*digiee);
00228
00229 if ( theOutputRecHitCollections.size()&& theOutputRecHitCollections[input].size())
00230 iEvent.put(recee,theOutputRecHitCollections[input]);
00231 else
00232 iEvent.put(recee);
00233
00234 if(doDigis_)
00235 iEvent.put(digiee);
00236 }
00237 break;
00238 case 4:
00239 {
00240
00241 std::auto_ptr<HBHERecHitCollection> rec1(new HBHERecHitCollection);
00242 std::auto_ptr<HBHEDigiCollection> digihbhe(new HBHEDigiCollection);
00243 HcalRecHitsMaker_->loadHcalRecHits(iEvent,*rec1,*digihbhe);
00244 if ( theOutputRecHitCollections.size()&& theOutputRecHitCollections[input].size())
00245 iEvent.put(rec1,theOutputRecHitCollections[input]);
00246 else
00247 iEvent.put(rec1);
00248
00249 if(doDigis_)
00250 iEvent.put(digihbhe);
00251 }
00252 break;
00253 case 5:
00254 {
00255
00256 std::auto_ptr<HORecHitCollection> rec2(new HORecHitCollection);
00257 std::auto_ptr<HODigiCollection> digiho(new HODigiCollection);
00258
00259 HcalRecHitsMaker_->loadHcalRecHits(iEvent,*rec2,*digiho);
00260 if(theOutputRecHitCollections.size()&& theOutputRecHitCollections[input].size())
00261 iEvent.put(rec2,theOutputRecHitCollections[input]);
00262 else
00263 iEvent.put(rec2);
00264 if(doDigis_)
00265 iEvent.put(digiho);
00266 }
00267 break;
00268 case 6:
00269 {
00270
00271 std::auto_ptr<HFRecHitCollection> rec3(new HFRecHitCollection);
00272 std::auto_ptr<HFDigiCollection> digihf(new HFDigiCollection);
00273 HcalRecHitsMaker_->loadHcalRecHits(iEvent,*rec3,*digihf);
00274 if(theOutputRecHitCollections.size()&& theOutputRecHitCollections[input].size())
00275 iEvent.put(rec3,theOutputRecHitCollections[input]);
00276 else
00277 iEvent.put(rec3);
00278 if(doDigis_)
00279 iEvent.put(digihf);
00280 }
00281 break;
00282 default:
00283 break;
00284 }
00285 }
00286 }
00287
00288 DEFINE_FWK_MODULE(CaloRecHitsProducer);