CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PileUp.h
Go to the documentation of this file.
1 #ifndef Mixing_Base_PileUp_h
2 #define Mixing_Base_PileUp_h
3 
4 #include <memory>
5 #include <string>
6 #include <vector>
7 //#include <boost/bind.hpp>
13 
14 #include "TRandom.h"
15 #include "TFile.h"
16 #include "TH1F.h"
17 
18 class TFile;
19 class TH1F;
20 
21 namespace CLHEP {
22  class RandPoissonQ;
23  class RandPoisson;
24  class HepRandomEngine;
25 }
26 
27 namespace edm {
28  class SecondaryEventProvider;
29  class StreamID;
30 
31  class PileUp {
32  public:
33  explicit PileUp(ParameterSet const& pset, double averageNumber, TH1F* const histo, const bool playback);
34  ~PileUp();
35 
36  template<typename T>
37  void readPileUp(edm::EventID const & signal, std::vector<edm::EventID> &ids, T eventOperator, const int NumPU, StreamID const&);
38 
39  template<typename T>
40  void playPileUp(const std::vector<edm::EventID> &ids, T eventOperator);
41 
42  double averageNumber() const {return averageNumber_;}
43  bool poisson() const {return poisson_;}
44  bool doPileUp() {return none_ ? false : averageNumber_>0.;}
45  void dropUnwantedBranches(std::vector<std::string> const& wantedBranches) {
46  input_->dropUnwantedBranches(wantedBranches);
47  }
48  void beginJob();
49  void endJob();
50 
51  void beginRun(const edm::Run& run, const edm::EventSetup& setup);
53 
54  void endRun(const edm::Run& run, const edm::EventSetup& setup);
56 
58 
59  void reload(const edm::EventSetup & setup);
60 
61  void CalculatePileup(int MinBunch, int MaxBunch, std::vector<int>& PileupSelection, std::vector<float>& TrueNumInteractions, StreamID const&);
62 
63  //template<typename T>
64  // void recordEventForPlayback(EventPrincipal const& eventPrincipal,
65  // std::vector<edm::EventID> &ids, T& eventOperator);
66 
67  const unsigned int & input()const{return inputType_;}
68  void input(unsigned int s){inputType_=s;}
69 
70  private:
71 
72  std::unique_ptr<CLHEP::RandPoissonQ> const& poissonDistribution(StreamID const& streamID);
73  std::unique_ptr<CLHEP::RandPoisson> const& poissonDistr_OOT(StreamID const& streamID);
74  CLHEP::HepRandomEngine* randomEngine(StreamID const& streamID);
75 
76  unsigned int inputType_;
79  int const intAverage_;
80  TH1F* histo_;
83  bool poisson_;
84  bool fixed_;
85  bool none_;
88  bool fixed_OOT_;
89 
90  bool PU_Study_;
92 
95 
96  std::shared_ptr<ProductRegistry> productRegistry_;
97  std::unique_ptr<VectorInputSource> const input_;
98  std::shared_ptr<ProcessConfiguration> processConfiguration_;
99  std::unique_ptr<EventPrincipal> eventPrincipal_;
100  std::shared_ptr<LuminosityBlockPrincipal> lumiPrincipal_;
101  std::shared_ptr<RunPrincipal> runPrincipal_;
102  std::unique_ptr<SecondaryEventProvider> provider_;
103  std::vector<std::unique_ptr<CLHEP::RandPoissonQ> > vPoissonDistribution_;
104  std::vector<std::unique_ptr<CLHEP::RandPoisson> > vPoissonDistr_OOT_;
105  std::vector<CLHEP::HepRandomEngine*> randomEngines_;
106 
107  TH1F *h1f;
110 
111  //playback info
112  bool playback_;
113 
114  // sequential reading
116 
117  // force reading pileup events from the same lumisection as the signal event
118  bool samelumi_;
119 
120  // read the seed for the histo and probability function cases
121  int seed_;
122  };
123 
124 
125 
126  template<typename T>
128  {
129  private:
130  std::vector<edm::EventID>& ids_;
133  public:
134  RecordEventID(std::vector<edm::EventID>& ids, T& eventOperator)
135  : ids_(ids), eventOperator_(eventOperator), eventCount( 0 ) {}
136  void operator()(EventPrincipal const& eventPrincipal) {
137  ids_.push_back(eventPrincipal.id());
138  eventOperator_(eventPrincipal, ++eventCount);
139  }
140  };
141 
142 
143  template<typename T>
145  {
146  private:
149  public:
150  PassEventID(T& eventOperator)
151  : eventOperator_(eventOperator), eventCount( 0 ) {}
152  void operator()(EventPrincipal const& eventPrincipal) {
153  eventOperator_(eventPrincipal, ++eventCount);
154  }
155  };
156 
157 
168  template<typename T>
169  void
170  PileUp::readPileUp(edm::EventID const & signal, std::vector<edm::EventID> &ids, T eventOperator,
171  const int pileEventCnt, StreamID const& streamID) {
172 
173  // One reason PileUp is responsible for recording event IDs is
174  // that it is the one that knows how many events will be read.
175  ids.reserve(pileEventCnt);
176  RecordEventID<T> recorder(ids,eventOperator);
177  int read;
178  if (samelumi_) {
179  const edm::LuminosityBlockID lumi(signal.run(), signal.luminosityBlock());
180  if (sequential_)
181  read = input_->loopSequentialWithID(*eventPrincipal_, lumi, pileEventCnt, recorder);
182  else
183  read = input_->loopRandomWithID(*eventPrincipal_, lumi, pileEventCnt, recorder, randomEngine(streamID));
184  } else {
185  if (sequential_) {
186  // boost::bind creates a functor from recordEventForPlayback
187  // so that recordEventForPlayback can insert itself before
188  // the original eventOperator.
189 
190  read = input_->loopSequential(*eventPrincipal_, pileEventCnt, recorder);
191  //boost::bind(&PileUp::recordEventForPlayback<T>,
192  // boost::ref(*this), _1, boost::ref(ids),
193  // boost::ref(eventOperator))
194  // );
195 
196  } else {
197  read = input_->loopRandom(*eventPrincipal_, pileEventCnt, recorder, randomEngine(streamID));
198  // boost::bind(&PileUp::recordEventForPlayback<T>,
199  // boost::ref(*this), _1, boost::ref(ids),
200  // boost::ref(eventOperator))
201  // );
202  }
203  }
204  if (read != pileEventCnt)
205  edm::LogWarning("PileUp") << "Could not read enough pileup events: only " << read << " out of " << pileEventCnt << " requested.";
206  }
207 
208 
209 
210  template<typename T>
211  void
212  PileUp::playPileUp(const std::vector<edm::EventID> &ids, T eventOperator) {
213  //TrueNumInteractions.push_back( ids.size() ) ;
214  PassEventID<T> recorder(eventOperator);
215  input_->loopSpecified(*eventPrincipal_,ids,recorder);
216  }
217 
218 
219 
222  /* template<typename T>
223  void recordEventForPlayback(EventPrincipal const& eventPrincipal,
224  std::vector<edm::EventID> &ids, T& eventOperator)
225  {
226  ids.push_back(eventPrincipal.id());
227  eventOperator(eventPrincipal);
228  }
229  */
230 }
231 
232 
233 #endif
void playPileUp(const std::vector< edm::EventID > &ids, T eventOperator)
Definition: PileUp.h:212
RunNumber_t run() const
Definition: EventID.h:39
bool manage_OOT_
Definition: PileUp.h:86
const unsigned int & input() const
Definition: PileUp.h:67
bool poisson() const
Definition: PileUp.h:43
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:102
std::vector< edm::EventID > & ids_
Definition: PileUp.h:130
TH1F * h1f
Definition: PileUp.h:107
std::shared_ptr< ProcessConfiguration > processConfiguration_
Definition: PileUp.h:98
unsigned int inputType_
Definition: PileUp.h:76
tuple lumi
Definition: fjr2json.py:35
T & eventOperator_
Definition: PileUp.h:147
void dropUnwantedBranches(std::vector< std::string > const &wantedBranches)
Definition: PileUp.h:45
void readPileUp(edm::EventID const &signal, std::vector< edm::EventID > &ids, T eventOperator, const int NumPU, StreamID const &)
Definition: PileUp.h:170
EventID const & id() const
void endJob()
Definition: PileUp.cc:171
PassEventID(T &eventOperator)
Definition: PileUp.h:150
TH1F * histo_
Definition: PileUp.h:80
bool fixed_
Definition: PileUp.h:84
PileUp(ParameterSet const &pset, double averageNumber, TH1F *const histo, const bool playback)
Definition: PileUp.cc:32
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:40
std::vector< CLHEP::HepRandomEngine * > randomEngines_
Definition: PileUp.h:105
int const intAverage_
Definition: PileUp.h:79
bool probFunctionDistribution_
Definition: PileUp.h:82
std::string Study_type_
Definition: PileUp.h:91
bool histoDistribution_
Definition: PileUp.h:81
bool poisson_
Definition: PileUp.h:83
void endLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &setup)
Definition: PileUp.cc:199
double averageNumber() const
Definition: PileUp.h:42
bool playback_
Definition: PileUp.h:112
std::vector< std::unique_ptr< CLHEP::RandPoissonQ > > vPoissonDistribution_
Definition: PileUp.h:103
bool samelumi_
Definition: PileUp.h:118
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:97
bool poisson_OOT_
Definition: PileUp.h:87
void beginJob()
Definition: PileUp.cc:164
void input(unsigned int s)
Definition: PileUp.h:68
int intFixed_ITPU_
Definition: PileUp.h:94
RecordEventID(std::vector< edm::EventID > &ids, T &eventOperator)
Definition: PileUp.h:134
void beginRun(const edm::Run &run, const edm::EventSetup &setup)
Definition: PileUp.cc:178
std::unique_ptr< CLHEP::RandPoissonQ > const & poissonDistribution(StreamID const &streamID)
Definition: PileUp.cc:312
bool PU_Study_
Definition: PileUp.h:90
void CalculatePileup(int MinBunch, int MaxBunch, std::vector< int > &PileupSelection, std::vector< float > &TrueNumInteractions, StreamID const &)
Definition: PileUp.cc:358
void beginLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &setup)
Definition: PileUp.cc:185
bool fixed_OOT_
Definition: PileUp.h:88
void setupPileUpEvent(const edm::EventSetup &setup)
Definition: PileUp.cc:205
std::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal_
Definition: PileUp.h:100
std::string type_
Definition: PileUp.h:77
void endRun(const edm::Run &run, const edm::EventSetup &setup)
Definition: PileUp.cc:194
TFile * probFileHisto
Definition: PileUp.h:109
std::shared_ptr< ProductRegistry > productRegistry_
Definition: PileUp.h:96
bool sequential_
Definition: PileUp.h:115
std::unique_ptr< CLHEP::RandPoisson > const & poissonDistr_OOT(StreamID const &streamID)
Definition: PileUp.cc:327
void reload(const edm::EventSetup &setup)
Definition: PileUp.cc:214
int seed_
Definition: PileUp.h:121
bool none_
Definition: PileUp.h:85
TH1F * hprobFunction
Definition: PileUp.h:108
CLHEP::HepRandomEngine * randomEngine(StreamID const &streamID)
Definition: PileUp.cc:342
tuple playback
Definition: Playback_cff.py:20
std::vector< std::unique_ptr< CLHEP::RandPoisson > > vPoissonDistr_OOT_
Definition: PileUp.h:104
int intFixed_OOT_
Definition: PileUp.h:93
bool doPileUp()
Definition: PileUp.h:44
void operator()(EventPrincipal const &eventPrincipal)
Definition: PileUp.h:152
std::unique_ptr< EventPrincipal > eventPrincipal_
Definition: PileUp.h:99
std::shared_ptr< RunPrincipal > runPrincipal_
Definition: PileUp.h:101
long double T
void operator()(EventPrincipal const &eventPrincipal)
Definition: PileUp.h:136
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
double averageNumber_
Definition: PileUp.h:78
Definition: Run.h:41