CMS 3D CMS Logo

BMixingModule.cc

Go to the documentation of this file.
00001 // File: BMixingModule.cc
00002 // Description:  see BMixingModule.h
00003 // Author:  Ursula Berthon, LLR Palaiseau, Bill Tanenbaum
00004 //
00005 //--------------------------------------------
00006 
00007 #include "Mixing/Base/interface/BMixingModule.h"
00008 #include "FWCore/Utilities/interface/GetPassID.h"
00009 #include "FWCore/Utilities/interface/GetReleaseVersion.h"
00010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00011 #include "FWCore/Framework/interface/Event.h"
00012 #include "FWCore/Framework/interface/EventSetup.h"
00013 #include "FWCore/Framework/interface/EventPrincipal.h"
00014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00015 #include "DataFormats/Provenance/interface/ModuleDescription.h"
00016 #include "DataFormats/Common/interface/Handle.h"
00017 
00018 using namespace std;
00019 
00020 int edm::BMixingModule::vertexoffset = 0;
00021 const unsigned int edm::BMixingModule::maxNbSources_ =5;
00022 
00023 namespace
00024 {
00025   boost::shared_ptr<edm::PileUp>
00026   maybeMakePileUp(edm::ParameterSet const& ps,std::string sourceName, const int minb, const int maxb, const bool playback)
00027   {
00028     boost::shared_ptr<edm::PileUp> pileup; // value to be returned
00029     // Make sure we have a parameter named 'sourceName'
00030     vector<string> names = ps.getParameterNames();
00031     if (find(names.begin(), names.end(), sourceName)
00032         != names.end())
00033       {
00034         // We have the parameter
00035         // and if we have either averageNumber or cfg by luminosity... make the PileUp
00036         double averageNumber;
00037         edm::ParameterSet psin=ps.getParameter<edm::ParameterSet>(sourceName);
00038         if (psin.getParameter<std::string>("type")!="none") {
00039           vector<string> namesIn = psin.getParameterNames();
00040           if (find(namesIn.begin(), namesIn.end(), std::string("nbPileupEvents"))
00041               != namesIn.end()) {
00042             edm::ParameterSet psin_average=psin.getParameter<edm::ParameterSet>("nbPileupEvents");
00043             vector<string> namesAverage = psin_average.getParameterNames();
00044             if (find(namesAverage.begin(), namesAverage.end(), std::string("averageNumber"))
00045                 != namesAverage.end()) 
00046               {
00047                 averageNumber=psin_average.getParameter<double>("averageNumber");
00048                 pileup.reset(new edm::PileUp(ps.getParameter<edm::ParameterSet>(sourceName),minb,maxb,averageNumber,playback));
00049                 edm::LogInfo("MixingModule") <<" Created source "<<sourceName<<" with minBunch,maxBunch "<<minb<<" "<<maxb<<" and averageNumber "<<averageNumber;
00050               }
00051         
00052             //special for pileup input
00053             else if (sourceName=="input" && find(namesAverage.begin(), namesAverage.end(), std::string("Lumi")) 
00054                      != namesAverage.end() && find(namesAverage.begin(), namesAverage.end(), std::string("sigmaInel"))
00055                      != namesAverage.end()) {
00056               averageNumber=psin_average.getParameter<double>("Lumi")*psin_average.getParameter<double>("sigmaInel")*ps.getParameter<int>("bunchspace")/1000*3564./2808.;  //FIXME
00057               pileup.reset(new edm::PileUp(ps.getParameter<edm::ParameterSet>(sourceName),minb,maxb,averageNumber,playback));
00058               edm::LogInfo("MixingModule") <<" Created source "<<sourceName<<" with minBunch,maxBunch "<<minb<<" "<<maxb;
00059               edm::LogInfo("MixingModule")<<" Luminosity configuration, average number used is "<<averageNumber;
00060             }
00061           }
00062         }
00063       }
00064     return pileup;
00065   }
00066 }
00067 
00068 namespace edm {
00069 
00070   // Constructor 
00071   BMixingModule::BMixingModule(const edm::ParameterSet& pset) :
00072     bunchSpace_(pset.getParameter<int>("bunchspace")),
00073     checktof_(pset.getUntrackedParameter<bool>("checktof",true)),
00074     minBunch_((pset.getParameter<int>("minBunch")*25)/pset.getParameter<int>("bunchspace")),
00075     maxBunch_((pset.getParameter<int>("maxBunch")*25)/pset.getParameter<int>("bunchspace")),
00076 //     input_(maybeMakePileUp(pset,"input",minBunch_,maxBunch_)),
00077 //     cosmics_(maybeMakePileUp(pset,"cosmics",minBunch_,maxBunch_)),
00078 //     beamHalo_p_(maybeMakePileUp(pset,"beamhalo_plus",minBunch_,maxBunch_)),
00079 //     beamHalo_m_(maybeMakePileUp(pset,"beamhalo_minus",minBunch_,maxBunch_)),
00080     md_()
00081   {
00082     md_.parameterSetID_ = pset.id();
00083     md_.moduleName_ = pset.getParameter<std::string>("@module_type");
00084     md_.moduleLabel_ = pset.getParameter<std::string>("@module_label");
00085     //#warning process name is hard coded, for now.  Fix this.
00086     //#warning the parameter set ID passed should be the one for the full process.  Fix this.
00087     md_.processConfiguration_ = ProcessConfiguration("PILEUP", pset.id(), getReleaseVersion(), getPassID());
00088     // FIXME: temporary to keep bwds compatibility for cfg files
00089     vector<string> names = pset.getParameterNames();
00090     if (find(names.begin(), names.end(),"playback")
00091         != names.end()) {
00092       playback_=pset.getUntrackedParameter<bool>("playback");
00093       if (playback_) LogInfo("MixingModule") <<" Mixing will be done in playback mode!";
00094     } else
00095       playback_=false;
00096 
00097     input_=     maybeMakePileUp(pset,"input",minBunch_,maxBunch_,playback_);
00098     cosmics_=   maybeMakePileUp(pset,"cosmics",minBunch_,maxBunch_,playback_);
00099     beamHalo_p_=maybeMakePileUp(pset,"beamhalo_plus",minBunch_,maxBunch_,playback_);
00100     beamHalo_m_=maybeMakePileUp(pset,"beamhalo_minus",minBunch_,maxBunch_,playback_);
00101     fwdDet_=maybeMakePileUp(pset,"forwardDetectors",minBunch_,maxBunch_,playback_);
00102 
00103     //prepare playback info structures
00104     fileSeqNrs_.resize(maxBunch_-minBunch_+1);
00105     eventIDs_.resize(maxBunch_-minBunch_+1);
00106     nrEvents_.resize(maxBunch_-minBunch_+1);
00107   }
00108 
00109   // Virtual destructor needed.
00110   BMixingModule::~BMixingModule() {;}
00111 
00112   // Functions that get called by framework every event
00113   void BMixingModule::produce(edm::Event& e, const edm::EventSetup&) { 
00114 
00115     // Create EDProduct
00116     createnewEDProduct();
00117 
00118     // Add signals 
00119     addSignals(e);
00120 
00121     // Read the PileUp 
00122     //    std::vector<EventPrincipalVector> pileup[maxNbSources_];
00123     //    bool doit[maxNbSources_];
00124     for (unsigned int is=0;is< maxNbSources_;++is) {
00125       doit_[is]=false;
00126       pileup_[is].clear();
00127     }
00128 
00129     if ( input_)  {  
00130       if (playback_) {
00131         getEventStartInfo(e,0);
00132         input_->readPileUp(pileup_[0],eventIDs_, fileSeqNrs_, nrEvents_);
00133       } else {
00134         input_->readPileUp(pileup_[0],eventIDs_, fileSeqNrs_, nrEvents_); 
00135         setEventStartInfo(0);
00136       }
00137       if (input_->doPileup()) {  
00138         LogDebug("MixingModule") <<"\n\n==============================>Adding pileup to signal event "<<e.id(); 
00139         doit_[0]=true;
00140       } 
00141     }
00142     if (cosmics_) {
00143       if (playback_) {
00144         getEventStartInfo(e,1);
00145         cosmics_->readPileUp(pileup_[1],eventIDs_, fileSeqNrs_, nrEvents_); 
00146       } else {
00147         cosmics_->readPileUp(pileup_[1],eventIDs_, fileSeqNrs_, nrEvents_); 
00148         setEventStartInfo(1);
00149       }
00150       if (cosmics_->doPileup()) {  
00151         LogDebug("MixingModule") <<"\n\n==============================>Adding cosmics to signal event "<<e.id(); 
00152         doit_[1]=true;
00153       } 
00154     }
00155 
00156     if (beamHalo_p_) {
00157       if (playback_) {
00158         getEventStartInfo(e,2);
00159         beamHalo_p_->readPileUp(pileup_[2],eventIDs_, fileSeqNrs_, nrEvents_);
00160       } else {
00161         beamHalo_p_->readPileUp(pileup_[2],eventIDs_, fileSeqNrs_, nrEvents_);
00162         setEventStartInfo(2);
00163       }
00164       if (beamHalo_p_->doPileup()) {  
00165         LogDebug("MixingModule") <<"\n\n==============================>Adding beam halo+ to signal event "<<e.id();
00166         doit_[2]=true;
00167       } 
00168     }
00169 
00170     if (beamHalo_m_) {
00171       if (playback_) {
00172         getEventStartInfo(e,3);
00173         beamHalo_m_->readPileUp(pileup_[3],eventIDs_, fileSeqNrs_, nrEvents_);
00174       } else {
00175         beamHalo_m_->readPileUp(pileup_[3],eventIDs_, fileSeqNrs_, nrEvents_);
00176         setEventStartInfo(3);
00177       }
00178       if (beamHalo_m_->doPileup()) {  
00179         LogDebug("MixingModule") <<"\n\n==============================>Adding beam halo- to signal event "<<e.id();
00180         doit_[3]=true;
00181       }
00182     }
00183 
00184     if (fwdDet_) {
00185       if (playback_) {
00186         getEventStartInfo(e,4);
00187         fwdDet_->readPileUp(pileup_[4],eventIDs_, fileSeqNrs_, nrEvents_);
00188       } else {
00189         fwdDet_->readPileUp(pileup_[4],eventIDs_, fileSeqNrs_, nrEvents_);
00190         setEventStartInfo(4);
00191       }
00192 
00193       if (fwdDet_->doPileup()) {  
00194         LogDebug("MixingModule") <<"\n\n==============================>Adding fwd detector source  to signal event "<<e.id();
00195         doit_[4]=true;
00196       }  
00197     }
00198 
00199     doPileUp(e);
00200 
00201     // Put output into event (here only playback info)
00202     put(e);
00203   }
00204 
00205  
00206   void BMixingModule::merge(const int bcr, const EventPrincipalVector& vec, unsigned int worker) {
00207     //
00208     // main loop: loop over events and merge 
00209     //
00210     eventId_=0;
00211     LogDebug("MixingModule") <<"For bunchcrossing "<<bcr<<", "<<vec.size()<< " events will be merged";
00212     vertexoffset=0;
00213     for (EventPrincipalVector::const_iterator it = vec.begin(); it != vec.end(); ++it) {
00214       Event e(**it, md_);
00215       LogDebug("MixingModule") <<" merging Event:  id " << e.id();
00216       addPileups(bcr, &e, ++eventId_,worker);
00217     }// end main loop
00218   }
00219 
00220   void BMixingModule::dropUnwantedBranches(std::vector<std::string> const& wantedBranches) {
00221       if (input_) input_->dropUnwantedBranches(wantedBranches);
00222       if (cosmics_) cosmics_->dropUnwantedBranches(wantedBranches);
00223       if (beamHalo_p_) beamHalo_p_->dropUnwantedBranches(wantedBranches);
00224       if (beamHalo_m_) beamHalo_m_->dropUnwantedBranches(wantedBranches);
00225       if (fwdDet_) fwdDet_->dropUnwantedBranches(wantedBranches);
00226   }
00227 
00228   void BMixingModule::endJob() {
00229       if (input_) input_->endJob();
00230       if (cosmics_) cosmics_->endJob();
00231       if (beamHalo_p_) beamHalo_p_->endJob();
00232       if (beamHalo_m_) beamHalo_m_->endJob();
00233       if (fwdDet_) fwdDet_->endJob();
00234   }
00235 
00236 } //edm

Generated on Tue Jun 9 17:40:39 2009 for CMSSW by  doxygen 1.5.4