CMS 3D CMS Logo

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>
12 
13 #include "TRandom.h"
14 #include "TFile.h"
15 #include "TH1F.h"
16 
17 class TFile;
18 class TH1F;
19 
20 namespace CLHEP {
21  class RandPoissonQ;
22  class RandPoisson;
23  class HepRandomEngine;
24 } // namespace CLHEP
25 
26 namespace edm {
27  class SecondaryEventProvider;
28  class StreamID;
29  class ProcessContext;
30 
31  struct PileUpConfig {
32  PileUpConfig(std::string sourcename, double averageNumber, std::unique_ptr<TH1F>& histo, const bool playback)
33  : sourcename_(sourcename), averageNumber_(averageNumber), histo_(histo.release()), playback_(playback) {}
36  std::shared_ptr<TH1F> histo_;
37  const bool playback_;
38  };
39 
40  class PileUp {
41  public:
42  explicit PileUp(ParameterSet const& pset, const std::shared_ptr<PileUpConfig>& config);
43  ~PileUp();
44 
45  template <typename T>
46  void readPileUp(edm::EventID const& signal,
47  std::vector<edm::SecondaryEventIDAndFileInfo>& ids,
48  T eventOperator,
49  int const NumPU,
50  StreamID const&);
51 
52  template <typename T>
53  void playPileUp(std::vector<edm::SecondaryEventIDAndFileInfo>::const_iterator begin,
54  std::vector<edm::SecondaryEventIDAndFileInfo>::const_iterator end,
55  std::vector<edm::SecondaryEventIDAndFileInfo>& ids,
56  T eventOperator);
57 
58  template <typename T>
59  void playOldFormatPileUp(std::vector<edm::EventID>::const_iterator begin,
60  std::vector<edm::EventID>::const_iterator end,
61  std::vector<edm::SecondaryEventIDAndFileInfo>& ids,
62  T eventOperator);
63 
64  double averageNumber() const { return averageNumber_; }
65  bool poisson() const { return poisson_; }
66  bool doPileUp(int BX) {
67  if (Source_type_ != "cosmics") {
68  return none_ ? false : averageNumber_ > 0.;
69  } else {
70  return (BX >= minBunch_cosmics_ && BX <= maxBunch_cosmics_);
71  }
72  }
73  void dropUnwantedBranches(std::vector<std::string> const& wantedBranches) {
74  input_->dropUnwantedBranches(wantedBranches);
75  }
76  void beginStream(edm::StreamID);
77  void endStream();
78 
79  void beginRun(const edm::Run& run, const edm::EventSetup& setup);
80  void beginLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& setup);
81 
82  void endRun(const edm::Run& run, const edm::EventSetup& setup);
83  void endLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& setup);
84 
85  void setupPileUpEvent(const edm::EventSetup& setup);
86 
87  void reload(const edm::EventSetup& setup);
88 
89  void CalculatePileup(int MinBunch,
90  int MaxBunch,
91  std::vector<int>& PileupSelection,
92  std::vector<float>& TrueNumInteractions,
93  StreamID const&);
94 
95  //template<typename T>
96  // void recordEventForPlayback(EventPrincipal const& eventPrincipal,
97  // std::vector<edm::SecondaryEventIDAndFileInfo> &ids, T& eventOperator);
98 
99  const unsigned int& input() const { return inputType_; }
100  void input(unsigned int s) { inputType_ = s; }
101 
102  private:
103  std::unique_ptr<CLHEP::RandPoissonQ> const& poissonDistribution(StreamID const& streamID);
104  std::unique_ptr<CLHEP::RandPoisson> const& poissonDistr_OOT(StreamID const& streamID);
105  CLHEP::HepRandomEngine* randomEngine(StreamID const& streamID);
106 
107  unsigned int inputType_;
111  int const intAverage_;
112  std::shared_ptr<TH1F> histo_;
115  bool poisson_;
116  bool fixed_;
117  bool none_;
121 
122  bool PU_Study_;
124 
127 
130 
132  std::shared_ptr<ProductRegistry> productRegistry_;
133  std::unique_ptr<VectorInputSource> const input_;
134  std::shared_ptr<ProcessConfiguration> processConfiguration_;
135  std::shared_ptr<ProcessContext> processContext_;
136  std::shared_ptr<StreamContext> streamContext_;
137  std::unique_ptr<EventPrincipal> eventPrincipal_;
138  std::shared_ptr<LuminosityBlockPrincipal> lumiPrincipal_;
139  std::shared_ptr<RunPrincipal> runPrincipal_;
140  std::unique_ptr<SecondaryEventProvider> provider_;
141  std::unique_ptr<CLHEP::RandPoissonQ> PoissonDistribution_;
142  std::unique_ptr<CLHEP::RandPoisson> PoissonDistr_OOT_;
143  CLHEP::HepRandomEngine* randomEngine_;
144 
145  //TH1F *h1f;
146  //TH1F *hprobFunction;
147  //TFile *probFileHisto;
148 
149  //playback info
150  bool playback_;
151 
152  // sequential reading
154  };
155 
156  template <typename T>
158  private:
159  std::vector<edm::SecondaryEventIDAndFileInfo>& ids_;
162 
163  public:
164  RecordEventID(std::vector<edm::SecondaryEventIDAndFileInfo>& ids, T& eventOperator)
165  : ids_(ids), eventOperator_(eventOperator), eventCount(1) {}
166  bool operator()(EventPrincipal const& eventPrincipal, size_t fileNameHash) {
167  bool used = eventOperator_(eventPrincipal, eventCount);
168  if (used) {
169  ++eventCount;
170  ids_.emplace_back(eventPrincipal.id(), fileNameHash);
171  }
172  return used;
173  }
174  };
175 
186  template <typename T>
187  void PileUp::readPileUp(edm::EventID const& signal,
188  std::vector<edm::SecondaryEventIDAndFileInfo>& ids,
189  T eventOperator,
190  int const pileEventCnt,
191  StreamID const& streamID) {
192  // One reason PileUp is responsible for recording event IDs is
193  // that it is the one that knows how many events will be read.
194  ids.reserve(pileEventCnt);
195  RecordEventID<T> recorder(ids, eventOperator);
196  int read = 0;
197  CLHEP::HepRandomEngine* engine = (sequential_ ? nullptr : randomEngine(streamID));
198  read = input_->loopOverEvents(*eventPrincipal_, fileNameHash_, pileEventCnt, recorder, engine, &signal);
199  if (read != pileEventCnt)
200  edm::LogWarning("PileUp") << "Could not read enough pileup events: only " << read << " out of " << pileEventCnt
201  << " requested.";
202  }
203 
204  template <typename T>
205  void PileUp::playPileUp(std::vector<edm::SecondaryEventIDAndFileInfo>::const_iterator begin,
206  std::vector<edm::SecondaryEventIDAndFileInfo>::const_iterator end,
207  std::vector<edm::SecondaryEventIDAndFileInfo>& ids,
208  T eventOperator) {
209  //TrueNumInteractions.push_back( end - begin ) ;
210  RecordEventID<T> recorder(ids, eventOperator);
211  input_->loopSpecified(*eventPrincipal_, fileNameHash_, begin, end, recorder);
212  }
213 
214  template <typename T>
215  void PileUp::playOldFormatPileUp(std::vector<edm::EventID>::const_iterator begin,
216  std::vector<edm::EventID>::const_iterator end,
217  std::vector<edm::SecondaryEventIDAndFileInfo>& ids,
218  T eventOperator) {
219  //TrueNumInteractions.push_back( end - begin ) ;
220  RecordEventID<T> recorder(ids, eventOperator);
221  input_->loopSpecified(*eventPrincipal_, fileNameHash_, begin, end, recorder);
222  }
223 
224 } // namespace edm
225 
226 #endif
CLHEP::HepRandomEngine * randomEngine
Definition: Dummies.cc:7
bool manage_OOT_
Definition: PileUp.h:118
const unsigned int & input() const
Definition: PileUp.h:99
size_t fileNameHash_
Definition: PileUp.h:131
bool poisson() const
Definition: PileUp.h:65
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:140
std::shared_ptr< ProcessConfiguration > processConfiguration_
Definition: PileUp.h:134
unsigned int inputType_
Definition: PileUp.h:107
bool operator()(EventPrincipal const &eventPrincipal, size_t fileNameHash)
Definition: PileUp.h:166
std::shared_ptr< TH1F > histo_
Definition: PileUp.h:36
void dropUnwantedBranches(std::vector< std::string > const &wantedBranches)
Definition: PileUp.h:73
EventID const & id() const
bool fixed_
Definition: PileUp.h:116
Definition: config.py:1
int const intAverage_
Definition: PileUp.h:111
std::shared_ptr< TH1F > histo_
Definition: PileUp.h:112
bool probFunctionDistribution_
Definition: PileUp.h:114
int maxBunch_cosmics_
Definition: PileUp.h:129
std::string Study_type_
Definition: PileUp.h:123
const bool playback_
Definition: PileUp.h:37
RecordEventID(std::vector< edm::SecondaryEventIDAndFileInfo > &ids, T &eventOperator)
Definition: PileUp.h:164
bool histoDistribution_
Definition: PileUp.h:113
bool poisson_
Definition: PileUp.h:115
double averageNumber() const
Definition: PileUp.h:64
bool playback_
Definition: PileUp.h:150
std::string sourcename_
Definition: PileUp.h:34
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:133
bool poisson_OOT_
Definition: PileUp.h:119
void input(unsigned int s)
Definition: PileUp.h:100
int intFixed_ITPU_
Definition: PileUp.h:126
#define end
Definition: vmac.h:39
bool PU_Study_
Definition: PileUp.h:122
bool doPileUp(int BX)
Definition: PileUp.h:66
bool fixed_OOT_
Definition: PileUp.h:120
int minBunch_cosmics_
Definition: PileUp.h:128
std::unique_ptr< CLHEP::RandPoisson > PoissonDistr_OOT_
Definition: PileUp.h:142
CLHEP::HepRandomEngine * randomEngine_
Definition: PileUp.h:143
std::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal_
Definition: PileUp.h:138
std::string type_
Definition: PileUp.h:108
std::vector< edm::SecondaryEventIDAndFileInfo > & ids_
Definition: PileUp.h:159
std::shared_ptr< ProductRegistry > productRegistry_
Definition: PileUp.h:132
bool sequential_
Definition: PileUp.h:153
std::string Source_type_
Definition: PileUp.h:109
#define begin
Definition: vmac.h:32
HLT enums.
bool none_
Definition: PileUp.h:117
std::unique_ptr< CLHEP::RandPoissonQ > PoissonDistribution_
Definition: PileUp.h:141
int intFixed_OOT_
Definition: PileUp.h:125
std::shared_ptr< ProcessContext > processContext_
Definition: PileUp.h:135
double averageNumber_
Definition: PileUp.h:35
std::unique_ptr< EventPrincipal > eventPrincipal_
Definition: PileUp.h:137
std::shared_ptr< RunPrincipal > runPrincipal_
Definition: PileUp.h:139
long double T
std::shared_ptr< StreamContext > streamContext_
Definition: PileUp.h:136
double averageNumber_
Definition: PileUp.h:110
Definition: Run.h:45
PileUpConfig(std::string sourcename, double averageNumber, std::unique_ptr< TH1F > &histo, const bool playback)
Definition: PileUp.h:32