00001
00002
00003
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;
00029
00030 vector<string> names = ps.getParameterNames();
00031 if (find(names.begin(), names.end(), sourceName)
00032 != names.end())
00033 {
00034
00035
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
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.;
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
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
00077
00078
00079
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
00086
00087 md_.processConfiguration_ = ProcessConfiguration("PILEUP", pset.id(), getReleaseVersion(), getPassID());
00088
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
00104 fileSeqNrs_.resize(maxBunch_-minBunch_+1);
00105 eventIDs_.resize(maxBunch_-minBunch_+1);
00106 nrEvents_.resize(maxBunch_-minBunch_+1);
00107 }
00108
00109
00110 BMixingModule::~BMixingModule() {;}
00111
00112
00113 void BMixingModule::produce(edm::Event& e, const edm::EventSetup&) {
00114
00115
00116 createnewEDProduct();
00117
00118
00119 addSignals(e);
00120
00121
00122
00123
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
00202 put(e);
00203 }
00204
00205
00206 void BMixingModule::merge(const int bcr, const EventPrincipalVector& vec, unsigned int worker) {
00207
00208
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 }
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 }