CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/SimGeneral/DataMixingModule/plugins/DataMixingModule.cc

Go to the documentation of this file.
00001 // File: DataMixingModule.cc
00002 // Description:  see DataMixingModule.h
00003 // Author:  Mike Hildreth, University of Notre Dame
00004 //
00005 //--------------------------------------------
00006 
00007 #include <map>
00008 #include <iostream>
00009 #include <boost/bind.hpp>
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011 #include "FWCore/Utilities/interface/EDMException.h"
00012 #include "FWCore/Framework/interface/ConstProductRegistry.h"
00013 #include "FWCore/ServiceRegistry/interface/Service.h"
00014 #include "DataFormats/Common/interface/Handle.h"
00015 #include "DataFormats/Provenance/interface/Provenance.h"
00016 #include "DataFormats/Provenance/interface/BranchDescription.h"
00017 //
00018 //
00019 #include "DataMixingModule.h"
00020 
00021 
00022 using namespace std;
00023 
00024 namespace edm
00025 {
00026 
00027   // Constructor 
00028   DataMixingModule::DataMixingModule(const edm::ParameterSet& ps) : BMixingModule(ps),
00029                                                             label_(ps.getParameter<std::string>("Label"))
00030 
00031   {                                                         // what's "label_"?
00032 
00033     // get the subdetector names
00034     this->getSubdetectorNames();  //something like this may be useful to check what we are supposed to do...
00035 
00036     // For now, list all of them here.  Later, make this selectable with input parameters
00037     // 
00038 
00039     // Check to see if we are working in Full or Fast Simulation
00040 
00041     DoFastSim_ = (ps.getParameter<std::string>("IsThisFastSim")).compare("YES") == 0;
00042     MergeEMDigis_ = (ps.getParameter<std::string>("EcalMergeType")).compare("Digis") == 0;
00043     MergeHcalDigis_ = (ps.getParameter<std::string>("HcalMergeType")).compare("Digis") == 0;
00044     if(MergeHcalDigis_) MergeHcalDigisProd_ = (ps.getParameter<std::string>("HcalDigiMerge")=="FullProd");
00045 
00046     // Put Fast Sim Sequences here for Simplification: Fewer options!
00047 
00048     if(DoFastSim_) {
00049 
00050     // declare the products to produce
00051 
00052       //Ecal:
00053 
00054       EBRecHitCollectionDM_        = ps.getParameter<std::string>("EBRecHitCollectionDM");
00055       EERecHitCollectionDM_        = ps.getParameter<std::string>("EERecHitCollectionDM");
00056       ESRecHitCollectionDM_        = ps.getParameter<std::string>("ESRecHitCollectionDM");
00057 
00058       produces< EBRecHitCollection >(EBRecHitCollectionDM_);
00059       produces< EERecHitCollection >(EERecHitCollectionDM_);
00060       produces< ESRecHitCollection >(ESRecHitCollectionDM_);
00061 
00062       EMWorker_ = new DataMixingEMWorker(ps);
00063 
00064       //Hcal:
00065 
00066       HBHERecHitCollectionDM_ = ps.getParameter<std::string>("HBHERecHitCollectionDM");
00067       HORecHitCollectionDM_   = ps.getParameter<std::string>("HORecHitCollectionDM");
00068       HFRecHitCollectionDM_   = ps.getParameter<std::string>("HFRecHitCollectionDM");
00069       ZDCRecHitCollectionDM_  = ps.getParameter<std::string>("ZDCRecHitCollectionDM");
00070 
00071       produces< HBHERecHitCollection >(HBHERecHitCollectionDM_);
00072       produces< HORecHitCollection >(HORecHitCollectionDM_);
00073       produces< HFRecHitCollection >(HFRecHitCollectionDM_);
00074       produces< ZDCRecHitCollection >(ZDCRecHitCollectionDM_);
00075 
00076       HcalWorker_ = new DataMixingHcalWorker(ps);
00077 
00078       //Muons:
00079 
00080       DTDigiCollectionDM_  = ps.getParameter<std::string>("DTDigiCollectionDM");
00081       RPCDigiCollectionDM_ = ps.getParameter<std::string>("RPCDigiCollectionDM");
00082       CSCStripDigiCollectionDM_ = ps.getParameter<std::string>("CSCStripDigiCollectionDM");
00083       CSCWireDigiCollectionDM_  = ps.getParameter<std::string>("CSCWireDigiCollectionDM");
00084       CSCComparatorDigiCollectionDM_  = ps.getParameter<std::string>("CSCComparatorDigiCollectionDM");
00085 
00086       produces< DTDigiCollection >();
00087       produces< RPCDigiCollection >();
00088       produces< CSCStripDigiCollection >(CSCStripDigiCollectionDM_);
00089       produces< CSCWireDigiCollection >(CSCWireDigiCollectionDM_);
00090       produces< CSCComparatorDigiCollection >(CSCComparatorDigiCollectionDM_);
00091 
00092       MuonWorker_ = new DataMixingMuonWorker(ps);
00093 
00094       //Tracks:
00095 
00096       GeneralTrackCollectionDM_  = ps.getParameter<std::string>("GeneralTrackDigiCollectionDM");
00097       produces< reco::TrackCollection >(GeneralTrackCollectionDM_);
00098       GeneralTrackWorker_ = new DataMixingGeneralTrackWorker(ps);
00099 
00100     }
00101     else{  // Full Simulation options
00102 
00103       //cout<<"FastSim False!!!"<<endl;
00104 
00105     // declare the products to produce
00106     // Start with EM
00107     if(MergeEMDigis_) {
00108 
00109       // cout<<"EM Digis TRUE!!!"<<endl;
00110 
00111       EBDigiCollectionDM_        = ps.getParameter<std::string>("EBDigiCollectionDM");
00112       EEDigiCollectionDM_        = ps.getParameter<std::string>("EEDigiCollectionDM");
00113       ESDigiCollectionDM_        = ps.getParameter<std::string>("ESDigiCollectionDM");
00114       //   nMaxPrintout_            = ps.getUntrackedParameter<int>("nMaxPrintout",10);
00115 
00116       produces< EBDigiCollection >(EBDigiCollectionDM_);
00117       produces< EEDigiCollection >(EEDigiCollectionDM_);
00118       produces< ESDigiCollection >(ESDigiCollectionDM_);
00119 
00120       EMDigiWorker_ = new DataMixingEMDigiWorker(ps);
00121     }
00122     else { // merge RecHits 
00123       EBRecHitCollectionDM_        = ps.getParameter<std::string>("EBRecHitCollectionDM");
00124       EERecHitCollectionDM_        = ps.getParameter<std::string>("EERecHitCollectionDM");
00125       ESRecHitCollectionDM_        = ps.getParameter<std::string>("ESRecHitCollectionDM");
00126       //   nMaxPrintout_            = ps.getUntrackedParameter<int>("nMaxPrintout",10);
00127 
00128       produces< EBRecHitCollection >(EBRecHitCollectionDM_);
00129       produces< EERecHitCollection >(EERecHitCollectionDM_);
00130       produces< ESRecHitCollection >(ESRecHitCollectionDM_);
00131 
00132       EMWorker_ = new DataMixingEMWorker(ps);
00133     }
00134     // Hcal next
00135 
00136     if(MergeHcalDigis_){
00137       //       cout<<"Hcal Digis TRUE!!!"<<endl;
00138 
00139       HBHEDigiCollectionDM_ = ps.getParameter<std::string>("HBHEDigiCollectionDM");
00140       HODigiCollectionDM_   = ps.getParameter<std::string>("HODigiCollectionDM");
00141       HFDigiCollectionDM_   = ps.getParameter<std::string>("HFDigiCollectionDM");
00142       ZDCDigiCollectionDM_  = ps.getParameter<std::string>("ZDCDigiCollectionDM");
00143 
00144       produces< HBHEDigiCollection >();
00145       produces< HODigiCollection >();
00146       produces< HFDigiCollection >();
00147       produces< ZDCDigiCollection >();
00148 
00149       if(MergeHcalDigisProd_) {
00150         HcalDigiWorkerProd_ = new DataMixingHcalDigiWorkerProd(ps);
00151       }
00152       else {HcalDigiWorker_ = new DataMixingHcalDigiWorker(ps);
00153       }
00154 
00155 
00156     }
00157     else{
00158       HBHERecHitCollectionDM_ = ps.getParameter<std::string>("HBHERecHitCollectionDM");
00159       HORecHitCollectionDM_   = ps.getParameter<std::string>("HORecHitCollectionDM");
00160       HFRecHitCollectionDM_   = ps.getParameter<std::string>("HFRecHitCollectionDM");
00161       ZDCRecHitCollectionDM_  = ps.getParameter<std::string>("ZDCRecHitCollectionDM");
00162 
00163       produces< HBHERecHitCollection >(HBHERecHitCollectionDM_);
00164       produces< HORecHitCollection >(HORecHitCollectionDM_);
00165       produces< HFRecHitCollection >(HFRecHitCollectionDM_);
00166       produces< ZDCRecHitCollection >(ZDCRecHitCollectionDM_);
00167 
00168       HcalWorker_ = new DataMixingHcalWorker(ps);
00169     }
00170 
00171     // Muons
00172 
00173     DTDigiCollectionDM_  = ps.getParameter<std::string>("DTDigiCollectionDM");
00174     RPCDigiCollectionDM_ = ps.getParameter<std::string>("RPCDigiCollectionDM");
00175     CSCStripDigiCollectionDM_ = ps.getParameter<std::string>("CSCStripDigiCollectionDM");
00176     CSCWireDigiCollectionDM_  = ps.getParameter<std::string>("CSCWireDigiCollectionDM");
00177     CSCComparatorDigiCollectionDM_  = ps.getParameter<std::string>("CSCComparatorDigiCollectionDM");
00178 
00179 
00180     produces< DTDigiCollection >();
00181     produces< RPCDigiCollection >();
00182     produces< CSCStripDigiCollection >(CSCStripDigiCollectionDM_);
00183     produces< CSCWireDigiCollection >(CSCWireDigiCollectionDM_);
00184     produces< CSCComparatorDigiCollection >(CSCComparatorDigiCollectionDM_);
00185 
00186     MuonWorker_ = new DataMixingMuonWorker(ps);
00187 
00188     // Si-Strips
00189 
00190     useSiStripRawDigi_ = ps.exists("SiStripRawDigiSource")?
00191       ps.getParameter<std::string>("SiStripRawDigiSource")=="PILEUP" ||
00192       ps.getParameter<std::string>("SiStripRawDigiSource")=="SIGNAL" : false;
00193 
00194     SiStripDigiCollectionDM_  = ps.getParameter<std::string>("SiStripDigiCollectionDM");
00195 
00196     if(useSiStripRawDigi_) {
00197 
00198       produces< edm::DetSetVector<SiStripRawDigi> > (SiStripDigiCollectionDM_);
00199       SiStripRawWorker_ = new DataMixingSiStripRawWorker(ps);
00200 
00201     } else {
00202 
00203       produces< edm::DetSetVector<SiStripDigi> > (SiStripDigiCollectionDM_);
00204       SiStripWorker_ = new DataMixingSiStripWorker(ps);
00205 
00206     }
00207 
00208     // Pixels
00209 
00210     PixelDigiCollectionDM_  = ps.getParameter<std::string>("PixelDigiCollectionDM");
00211 
00212     produces< edm::DetSetVector<PixelDigi> > (PixelDigiCollectionDM_);
00213 
00214     SiPixelWorker_ = new DataMixingSiPixelWorker(ps);
00215 
00216     }
00217 
00218     // Pileup Information: if doing pre-mixing, we have to save the pileup information from the Secondary stream
00219 
00220     MergePileup_ = ps.getParameter<bool>("MergePileupInfo");
00221 
00222     if(MergePileup_) {
00223       produces< std::vector<PileupSummaryInfo> >();
00224       produces<CrossingFramePlaybackInfoExtended>();
00225 
00226       PUWorker_ = new DataMixingPileupCopy(ps);
00227     }
00228 
00229   }
00230 
00231   void DataMixingModule::getSubdetectorNames() {
00232     // get subdetector names
00233     // edm::Service<edm::ConstProductRegistry> reg;
00234     // Loop over provenance of products in registry.
00235     //for (edm::ProductRegistry::ProductList::const_iterator it = reg->productList().begin(); it != reg->productList().end(); ++it) {
00236 
00237       //  **** Check this out.... ****
00238 
00239       // See FWCore/Framework/interface/BranchDescription.h
00240       // BranchDescription contains all the information for the product.
00241 
00242       // This section not very backwards-compatible in terms of digi-merging.  Need to be able to specify here which data format
00243       // to look at...
00244 
00245       //      edm::BranchDescription desc = it->second;
00246       //if (!desc.friendlyClassName_.compare(0,9,"EBRecHitC")) {
00247       //        Subdetectors_.push_back(desc.productInstanceName_);
00248       //LogInfo("DataMixingModule") <<"Adding container "<<desc.productInstanceName_ <<" for pileup treatment";
00249       //}
00250       //else if (!desc.friendlyClassName_.compare(0,9,"EERecHitC")) {
00251         //      else if (!desc.friendlyClassName_.compare(0,9,"EErechitC") && desc.productInstanceName_.compare(0,11,"TrackerHits")) {
00252       //        Subdetectors_.push_back(desc.productInstanceName_);
00253       //LogInfo("DataMixingModule") <<"Adding container "<<desc.productInstanceName_ <<" for pileup treatment";
00254       //}
00255       //else if (!desc.friendlyClassName_.compare(0,9,"HBRecHitC")) {
00256       //        Subdetectors_.push_back(desc.productInstanceName_);
00257       //LogInfo("DataMixingModule") <<"Adding container "<<desc.productInstanceName_ <<" for pileup treatment";
00258       //}
00259       //else if (!desc.friendlyClassName_.compare(0,9,"HERecHitC")) {
00260       //        Subdetectors_.push_back(desc.productInstanceName_);
00261       //LogInfo("DataMixingModule") <<"Adding container "<<desc.productInstanceName_ <<" for pileup treatment";
00262       // }
00263         // and so on with other detector types...
00264     // }
00265   }       
00266                
00267 
00268  
00269 
00270   // Virtual destructor needed.
00271   DataMixingModule::~DataMixingModule() { 
00272     if(MergeEMDigis_){ delete EMDigiWorker_;}
00273     else {delete EMWorker_;}
00274     if(MergeHcalDigis_) { 
00275       if(MergeHcalDigisProd_) { delete HcalDigiWorkerProd_;}
00276       else { delete HcalDigiWorker_; }}
00277     else {delete HcalWorker_;}
00278     if(MuonWorker_) delete MuonWorker_;
00279     if(DoFastSim_){
00280       delete GeneralTrackWorker_;
00281     }else{
00282       if(useSiStripRawDigi_)
00283         delete SiStripRawWorker_;
00284       else
00285         delete SiStripWorker_;
00286       delete SiPixelWorker_;
00287     }
00288     if(MergePileup_) { delete PUWorker_;}
00289   }
00290 
00291   void DataMixingModule::addSignals(const edm::Event &e, const edm::EventSetup& ES) { 
00292     // fill in maps of hits
00293 
00294     LogDebug("DataMixingModule")<<"===============> adding MC signals for "<<e.id();
00295 
00296     // Ecal
00297     if(MergeEMDigis_) { EMDigiWorker_->addEMSignals(e, ES); }
00298     else{ EMWorker_->addEMSignals(e);}
00299 
00300     // Hcal
00301     if(MergeHcalDigis_) { 
00302       if(MergeHcalDigisProd_){
00303         HcalDigiWorkerProd_->addHcalSignals(e, ES);
00304       }
00305       else{
00306         HcalDigiWorker_->addHcalSignals(e, ES);
00307       }
00308     }
00309     else {HcalWorker_->addHcalSignals(e);}
00310     
00311     // Muon
00312     MuonWorker_->addMuonSignals(e);
00313 
00314     if(DoFastSim_){
00315        GeneralTrackWorker_->addGeneralTrackSignals(e);
00316     }else{
00317     // SiStrips
00318     if(useSiStripRawDigi_) SiStripRawWorker_->addSiStripSignals(e);
00319     else SiStripWorker_->addSiStripSignals(e);
00320 
00321     // SiPixels
00322     SiPixelWorker_->addSiPixelSignals(e);
00323     }    
00324     AddedPileup_ = false;
00325 
00326   } // end of addSignals
00327 
00328   
00329 
00330 
00331   void DataMixingModule::pileWorker(const EventPrincipal &ep, int bcr, int eventNr, const edm::EventSetup& ES) {  
00332 
00333 
00334     LogDebug("DataMixingModule") <<"\n===============> adding pileups from event  "<<ep.id()<<" for bunchcrossing "<<bcr;
00335 
00336     // fill in maps of hits; same code as addSignals, except now applied to the pileup events
00337 
00338     // Ecal
00339     if(MergeEMDigis_) {    EMDigiWorker_->addEMPileups(bcr, &ep, eventNr, ES);}
00340     else {EMWorker_->addEMPileups(bcr, &ep, eventNr); }
00341 
00342     // Hcal
00343     if(MergeHcalDigis_) {    
00344       if(MergeHcalDigisProd_) {    
00345         HcalDigiWorkerProd_->addHcalPileups(bcr, &ep, eventNr, ES);
00346       }
00347       else{
00348         HcalDigiWorker_->addHcalPileups(bcr, &ep, eventNr, ES);}
00349     }
00350     else {HcalWorker_->addHcalPileups(bcr, &ep, eventNr);}
00351 
00352     // Muon
00353     MuonWorker_->addMuonPileups(bcr, &ep, eventNr);
00354 
00355     if(DoFastSim_){
00356       GeneralTrackWorker_->addGeneralTrackPileups(bcr, &ep, eventNr);
00357     }else{
00358       
00359       // SiStrips
00360       if(useSiStripRawDigi_) SiStripRawWorker_->addSiStripPileups(bcr, &ep, eventNr);
00361       else SiStripWorker_->addSiStripPileups(bcr, &ep, eventNr);
00362       
00363       // SiPixels
00364       SiPixelWorker_->addSiPixelPileups(bcr, &ep, eventNr);
00365     }
00366 
00367     // check and see if we need to copy the pileup information from 
00368     // secondary stream to the output stream  
00369     // We only have the pileup event here, so pick the first time and store the info
00370 
00371     if(MergePileup_ && !AddedPileup_){
00372       
00373       PUWorker_->addPileupInfo(&ep, eventNr);
00374 
00375       AddedPileup_ = true;
00376     }
00377 
00378   }
00379 
00380 
00381   
00382   void DataMixingModule::doPileUp(edm::Event &e, const edm::EventSetup& ES)
00383   {
00384     std::vector<edm::EventID> recordEventID;
00385     std::vector<int> PileupList;
00386     PileupList.clear();
00387     TrueNumInteractions_.clear();
00388 
00389     for (int bunchCrossing=minBunch_;bunchCrossing<=maxBunch_;++bunchCrossing) {
00390       for (unsigned int isource=0;isource<maxNbSources_;++isource) {
00391         boost::shared_ptr<PileUp> source = inputSources_[isource];
00392         if (not source or not source->doPileUp()) 
00393           continue;
00394 
00395         if (isource==0) 
00396           source->CalculatePileup(minBunch_, maxBunch_, PileupList, TrueNumInteractions_);
00397 
00398         int NumPU_Events = 0;
00399         if (isource ==0) { 
00400           NumPU_Events = PileupList[bunchCrossing - minBunch_];
00401         } else {
00402           // non-minbias pileup only gets one event for now. Fix later if desired.
00403           NumPU_Events = 1;
00404         }  
00405 
00406         source->readPileUp(
00407                 e.id(),
00408                 recordEventID,
00409                 boost::bind(&DataMixingModule::pileWorker, boost::ref(*this),
00410                             _1, bunchCrossing, _2, boost::cref(ES)),
00411                 NumPU_Events
00412                 );
00413       }
00414     }
00415 
00416   }
00417 
00418 
00419   void DataMixingModule::put(edm::Event &e,const edm::EventSetup& ES) {
00420 
00421     // individual workers...
00422 
00423     // Ecal
00424     if(MergeEMDigis_) {EMDigiWorker_->putEM(e,ES);}
00425     else {EMWorker_->putEM(e);}
00426 
00427     // Hcal
00428     if(MergeHcalDigis_) {
00429       if(MergeHcalDigisProd_) {
00430         HcalDigiWorkerProd_->putHcal(e,ES);
00431       }
00432       else{
00433         HcalDigiWorker_->putHcal(e,ES);
00434       }
00435     }
00436     else {HcalWorker_->putHcal(e);}
00437 
00438     // Muon
00439     MuonWorker_->putMuon(e);
00440 
00441     if(DoFastSim_){
00442        GeneralTrackWorker_->putGeneralTrack(e);
00443     }else{
00444        // SiStrips
00445       if(useSiStripRawDigi_) SiStripRawWorker_->putSiStrip(e);
00446       else SiStripWorker_->putSiStrip(e);
00447        
00448        // SiPixels
00449        SiPixelWorker_->putSiPixel(e);
00450     }
00451 
00452     if(MergePileup_) { PUWorker_->putPileupInfo(e);}
00453 
00454 
00455   }
00456 
00457 
00458 } //edm