Go to the documentation of this file.00001 #ifndef Base_PileUp_h
00002 #define Base_PileUp_h
00003
00004 #include <string>
00005 #include <vector>
00006 #include <boost/bind.hpp>
00007 #include "FWCore/Framework/interface/Frameworkfwd.h"
00008 #include "FWCore/Sources/interface/VectorInputSource.h"
00009 #include "DataFormats/Provenance/interface/EventID.h"
00010 #include "FWCore/Framework/interface/EventPrincipal.h"
00011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00012
00013 #include "CLHEP/Random/RandPoissonQ.h"
00014 #include "CLHEP/Random/RandFlat.h"
00015
00016 #include "TRandom.h"
00017 #include "TFile.h"
00018 #include "TH1F.h"
00019
00020 class TFile;
00021 class TH1F;
00022
00023 namespace CLHEP {
00024 class RandPoissonQ;
00025 class RandPoisson;
00026 }
00027
00028
00029
00030 namespace edm {
00031 class PileUp {
00032 public:
00033 explicit PileUp(ParameterSet const& pset, double averageNumber, TH1F* const histo, const bool playback);
00034 ~PileUp();
00035
00036 template<typename T>
00037 void readPileUp(edm::EventID const & signal, std::vector<edm::EventID> &ids, T eventOperator, const int NumPU );
00038
00039 template<typename T>
00040 void playPileUp(const std::vector<edm::EventID> &ids, T eventOperator);
00041
00042 double averageNumber() const {return averageNumber_;}
00043 bool poisson() const {return poisson_;}
00044 bool doPileUp() {return none_ ? false : averageNumber_>0.;}
00045 void dropUnwantedBranches(std::vector<std::string> const& wantedBranches) {
00046 input_->dropUnwantedBranches(wantedBranches);
00047 }
00048 void endJob () {
00049 input_->doEndJob();
00050 }
00051
00052 void reload(const edm::EventSetup & setup);
00053
00054 void CalculatePileup(int MinBunch, int MaxBunch, std::vector<int>& PileupSelection, std::vector<float>& TrueNumInteractions);
00055
00056
00057
00058
00059
00060 const unsigned int & input()const{return inputType_;}
00061 void input(unsigned int s){inputType_=s;}
00062
00063 private:
00064 unsigned int inputType_;
00065 std::string type_;
00066 double averageNumber_;
00067 int const intAverage_;
00068 TH1F* histo_;
00069 bool histoDistribution_;
00070 bool probFunctionDistribution_;
00071 bool poisson_;
00072 bool fixed_;
00073 bool none_;
00074 bool manage_OOT_;
00075 bool poisson_OOT_;
00076 bool fixed_OOT_;
00077
00078 bool PU_Study_;
00079 std::string Study_type_;
00080
00081 int intFixed_OOT_;
00082 int intFixed_ITPU_;
00083
00084 VectorInputSource * const input_;
00085 CLHEP::RandPoissonQ *poissonDistribution_;
00086 CLHEP::RandPoisson *poissonDistr_OOT_;
00087
00088
00089 TH1F *h1f;
00090 TH1F *hprobFunction;
00091 TFile *probFileHisto;
00092
00093
00094 bool playback_;
00095
00096
00097 bool sequential_;
00098
00099
00100 bool samelumi_;
00101
00102
00103 int seed_;
00104 };
00105
00106
00107
00108 template<typename T>
00109 class RecordEventID
00110 {
00111 private:
00112 std::vector<edm::EventID>& ids_;
00113 T& eventOperator_;
00114 int eventCount ;
00115 public:
00116 RecordEventID(std::vector<edm::EventID>& ids, T& eventOperator)
00117 : ids_(ids), eventOperator_(eventOperator), eventCount( 0 ) {}
00118 void operator()(EventPrincipal const& eventPrincipal) {
00119 ids_.push_back(eventPrincipal.id());
00120 eventOperator_(eventPrincipal, ++eventCount);
00121 }
00122 };
00123
00124
00135 template<typename T>
00136 void
00137 PileUp::readPileUp(edm::EventID const & signal, std::vector<edm::EventID> &ids, T eventOperator, const int pileEventCnt) {
00138
00139
00140
00141 ids.reserve(pileEventCnt);
00142 RecordEventID<T> recorder(ids,eventOperator);
00143 int read;
00144 if (samelumi_) {
00145 const edm::LuminosityBlockID lumi(signal.run(), signal.luminosityBlock());
00146 if (sequential_)
00147 read = input_->loopSequentialWithID(lumi, pileEventCnt, recorder);
00148 else
00149 read = input_->loopRandomWithID(lumi, pileEventCnt, recorder);
00150 } else {
00151 if (sequential_) {
00152
00153
00154
00155
00156 read = input_->loopSequential(pileEventCnt, recorder);
00157
00158
00159
00160
00161
00162 } else {
00163 read = input_->loopRandom(pileEventCnt, recorder);
00164
00165
00166
00167
00168 }
00169 }
00170 if (read != pileEventCnt)
00171 edm::LogWarning("PileUp") << "Could not read enough pileup events: only " << read << " out of " << pileEventCnt << " requested.";
00172 }
00173
00174
00175
00176 template<typename T>
00177 void
00178 PileUp::playPileUp(const std::vector<edm::EventID> &ids, T eventOperator) {
00179
00180 input_->loopSpecified(ids,eventOperator);
00181 }
00182
00183
00184
00187
00188
00189
00190
00191
00192
00193
00194
00195 }
00196
00197
00198 #endif