CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
edm::PileUp Class Reference

#include <PileUp.h>

Public Member Functions

double averageNumber () const
 
void beginJob ()
 
void beginLuminosityBlock (const edm::LuminosityBlock &lumi, const edm::EventSetup &setup)
 
void beginRun (const edm::Run &run, const edm::EventSetup &setup)
 
void CalculatePileup (int MinBunch, int MaxBunch, std::vector< int > &PileupSelection, std::vector< float > &TrueNumInteractions, StreamID const &)
 
bool doPileUp ()
 
void dropUnwantedBranches (std::vector< std::string > const &wantedBranches)
 
void endJob ()
 
void endLuminosityBlock (const edm::LuminosityBlock &lumi, const edm::EventSetup &setup)
 
void endRun (const edm::Run &run, const edm::EventSetup &setup)
 
const unsigned int & input () const
 
void input (unsigned int s)
 
 PileUp (ParameterSet const &pset, double averageNumber, TH1F *const histo, const bool playback)
 
template<typename T >
void playPileUp (const std::vector< edm::EventID > &ids, T eventOperator)
 
bool poisson () const
 
template<typename T >
void readPileUp (edm::EventID const &signal, std::vector< edm::EventID > &ids, T eventOperator, const int NumPU, StreamID const &)
 
void reload (const edm::EventSetup &setup)
 
void setupPileUpEvent (const edm::EventSetup &setup)
 
 ~PileUp ()
 

Private Member Functions

std::unique_ptr
< CLHEP::RandPoisson > const & 
poissonDistr_OOT (StreamID const &streamID)
 
std::unique_ptr
< CLHEP::RandPoissonQ > const & 
poissonDistribution (StreamID const &streamID)
 
CLHEP::HepRandomEngine * randomEngine (StreamID const &streamID)
 

Private Attributes

double averageNumber_
 
std::unique_ptr< EventPrincipaleventPrincipal_
 
bool fixed_
 
bool fixed_OOT_
 
TH1F * h1f
 
TH1F * histo_
 
bool histoDistribution_
 
TH1F * hprobFunction
 
std::unique_ptr
< VectorInputSource > const 
input_
 
unsigned int inputType_
 
int const intAverage_
 
int intFixed_ITPU_
 
int intFixed_OOT_
 
boost::shared_ptr
< LuminosityBlockPrincipal
lumiPrincipal_
 
bool manage_OOT_
 
bool none_
 
bool playback_
 
bool poisson_
 
bool poisson_OOT_
 
TFile * probFileHisto
 
bool probFunctionDistribution_
 
boost::shared_ptr
< ProcessConfiguration
processConfiguration_
 
boost::shared_ptr
< ProductRegistry
productRegistry_
 
std::unique_ptr
< SecondaryEventProvider
provider_
 
bool PU_Study_
 
std::vector
< CLHEP::HepRandomEngine * > 
randomEngines_
 
boost::shared_ptr< RunPrincipalrunPrincipal_
 
bool samelumi_
 
int seed_
 
bool sequential_
 
std::string Study_type_
 
std::string type_
 
std::vector< std::unique_ptr
< CLHEP::RandPoisson > > 
vPoissonDistr_OOT_
 
std::vector< std::unique_ptr
< CLHEP::RandPoissonQ > > 
vPoissonDistribution_
 

Detailed Description

Definition at line 33 of file PileUp.h.

Constructor & Destructor Documentation

edm::PileUp::PileUp ( ParameterSet const &  pset,
double  averageNumber,
TH1F *const  histo,
const bool  playback 
)
explicit

Definition at line 33 of file PileUp.cc.

References dqmPostProcessing_online::DB, edm::ParameterSet::emptyParameterSetID(), eventPrincipal_, edm::hlt::Exception, edm::ParameterSet::exists(), edm::ParameterSet::existsAs(), fixed_, fixed_OOT_, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), histoDistribution_, input_, intFixed_ITPU_, intFixed_OOT_, edm::Service< T >::isAvailable(), manage_OOT_, edm::RandomNumberGenerator::mySeed(), none_, poisson_, poisson_OOT_, probFunctionDistribution_, processConfiguration_, productRegistry_, provider_, PU_Study_, seed_, AlCaHLTBitMon_QueryRunRegistry::string, Study_type_, and type_.

33  :
34  type_(pset.getParameter<std::string>("type")),
36  intAverage_(static_cast<int>(averageNumber)),
37  histo_(histo),
38  histoDistribution_(type_ == "histo"),
39  probFunctionDistribution_(type_ == "probFunction"),
40  poisson_(type_ == "poisson"),
41  fixed_(type_ == "fixed"),
42  none_(type_ == "none"),
44  input_(VectorInputSourceFactory::get()->makeVectorInputSource(pset, InputSourceDescription(
45  ModuleDescription(),
47  boost::shared_ptr<BranchIDListHelper>(new BranchIDListHelper),
48  boost::shared_ptr<ActivityRegistry>(new ActivityRegistry),
49  -1, -1,
50  PreallocationConfiguration()
51  )).release()),
52  processConfiguration_(new ProcessConfiguration(std::string("@MIXING"), getReleaseVersion(), getPassID())),
55  runPrincipal_(),
56  provider_(),
61  sequential_(pset.getUntrackedParameter<bool>("sequential", false)),
62  samelumi_(pset.getUntrackedParameter<bool>("sameLumiBlock", false)),
63  seed_(0) {
64 
65  // Use the empty parameter set for the parameter set ID of our "@MIXING" process.
67 
68  if(pset.existsAs<std::vector<ParameterSet> >("producers", true)) {
69  std::vector<ParameterSet> producers = pset.getParameter<std::vector<ParameterSet> >("producers");
70  provider_.reset(new SecondaryEventProvider(producers, *productRegistry_, processConfiguration_));
71  }
72 
73  productRegistry_->setFrozen();
74 
75  // A modified HistoryAppender must be used for unscheduled processing.
76  eventPrincipal_.reset(new EventPrincipal(input_->productRegistry(),
77  input_->branchIDListHelper(),
79  nullptr));
80 
81  if (pset.exists("nbPileupEvents")) {
82  seed_=pset.getParameter<edm::ParameterSet>("nbPileupEvents").getUntrackedParameter<int>("seed",0);
83  }
84 
85  bool DB=type_=="readDB";
86 
88  if (!rng.isAvailable()) {
89  throw cms::Exception("Configuration")
90  << "PileUp requires the RandomNumberGeneratorService\n"
91  "which is not present in the configuration file. You must add the service\n"
92  "in the configuration file or remove the modules that require it.";
93  }
94 
95  // Get seed for the case when using user histogram or probability function
96  // RANDOM_NUMBER_ERROR
97  // Random number should be generated by the engines from the
98  // RandomNumberGeneratorService. This appears to use the global
99  // engine in ROOT. This is not thread safe unless the module using
100  // it is a one module and declares a shared resource and all
101  // other modules using it also declare the same shared resource.
102  // This also breaks replay.
104  if(seed_ !=0) {
105  gRandom->SetSeed(seed_);
106  LogInfo("MixingModule") << " Change seed for " << type_ << " mode. The seed is set to " << seed_;
107  }
108  else {
109  gRandom->SetSeed(rng->mySeed());
110  }
111  }
112 
114  throw cms::Exception("Illegal parameter value","PileUp::PileUp(ParameterSet const& pset)")
115  << "'type' parameter (a string) has a value of '" << type_ << "'.\n"
116  << "Legal values are 'poisson', 'fixed', or 'none'\n";
117  }
118 
119  if (!DB){
120  manage_OOT_ = pset.getUntrackedParameter<bool>("manage_OOT", false);
121 
122  // Check for string describing special processing. Add these here for individual cases
123 
124  PU_Study_ = false;
125  Study_type_ = "";
126 
127  Study_type_ = pset.getUntrackedParameter<std::string>("Special_Pileup_Studies", "");
128 
129  if(Study_type_ == "Fixed_ITPU_Vary_OOTPU") {
130 
131  PU_Study_ = true;
132  intFixed_ITPU_ = pset.getUntrackedParameter<int>("intFixed_ITPU", 0);
133 
134  }
135 
136  if(manage_OOT_) { // figure out what the parameters are
137 
138  // if (playback_) throw cms::Exception("Illegal parameter clash","PileUp::PileUp(ParameterSet const& pset)")
139  // << " manage_OOT option not allowed with playback ";
140 
141  std::string OOT_type = pset.getUntrackedParameter<std::string>("OOT_type");
142 
143  if(OOT_type == "Poisson" || OOT_type == "poisson") {
144  poisson_OOT_ = true;
145  }
146  else if(OOT_type == "Fixed" || OOT_type == "fixed") {
147  fixed_OOT_ = true;
148  // read back the fixed number requested out-of-time
149  intFixed_OOT_ = pset.getUntrackedParameter<int>("intFixed_OOT", -1);
150  if(intFixed_OOT_ < 0) {
151  throw cms::Exception("Illegal parameter value","PileUp::PileUp(ParameterSet const& pset)")
152  << " Fixed out-of-time pileup requested, but no fixed value given ";
153  }
154  }
155  else {
156  throw cms::Exception("Illegal parameter value","PileUp::PileUp(ParameterSet const& pset)")
157  << "'OOT_type' parameter (a string) has a value of '" << OOT_type << "'.\n"
158  << "Legal values are 'poisson' or 'fixed'\n";
159  }
160  edm::LogInfo("MixingModule") <<" Out-of-time pileup will be generated with a " << OOT_type << " distribution. " ;
161  }
162  }
163 
164  }
boost::shared_ptr< RunPrincipal > runPrincipal_
Definition: PileUp.h:103
bool manage_OOT_
Definition: PileUp.h:88
std::string getPassID()
Definition: GetPassID.h:8
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
TH1F * histo_
Definition: PileUp.h:82
bool fixed_
Definition: PileUp.h:86
std::vector< CLHEP::HepRandomEngine * > randomEngines_
Definition: PileUp.h:107
int const intAverage_
Definition: PileUp.h:81
bool probFunctionDistribution_
Definition: PileUp.h:84
std::string Study_type_
Definition: PileUp.h:93
boost::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal_
Definition: PileUp.h:102
bool histoDistribution_
Definition: PileUp.h:83
bool poisson_
Definition: PileUp.h:85
double averageNumber() const
Definition: PileUp.h:44
bool playback_
Definition: PileUp.h:114
virtual std::uint32_t mySeed() const =0
std::vector< std::unique_ptr< CLHEP::RandPoissonQ > > vPoissonDistribution_
Definition: PileUp.h:105
bool samelumi_
Definition: PileUp.h:120
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:99
bool poisson_OOT_
Definition: PileUp.h:89
bool isAvailable() const
Definition: Service.h:46
int intFixed_ITPU_
Definition: PileUp.h:96
bool PU_Study_
Definition: PileUp.h:92
bool fixed_OOT_
Definition: PileUp.h:90
std::string getReleaseVersion()
std::string type_
Definition: PileUp.h:79
boost::shared_ptr< ProductRegistry > productRegistry_
Definition: PileUp.h:98
boost::shared_ptr< ProcessConfiguration > processConfiguration_
Definition: PileUp.h:100
bool sequential_
Definition: PileUp.h:117
int seed_
Definition: PileUp.h:123
bool none_
Definition: PileUp.h:87
tuple playback
Definition: Playback_cff.py:20
std::vector< std::unique_ptr< CLHEP::RandPoisson > > vPoissonDistr_OOT_
Definition: PileUp.h:106
int intFixed_OOT_
Definition: PileUp.h:95
std::unique_ptr< EventPrincipal > eventPrincipal_
Definition: PileUp.h:101
static VectorInputSourceFactory const * get()
static ParameterSetID emptyParameterSetID()
double averageNumber_
Definition: PileUp.h:80
edm::PileUp::~PileUp ( )

Definition at line 310 of file PileUp.cc.

310  {
311  }

Member Function Documentation

double edm::PileUp::averageNumber ( ) const
inline

Definition at line 44 of file PileUp.h.

References averageNumber_.

Referenced by reload().

44 {return averageNumber_;}
double averageNumber_
Definition: PileUp.h:80
void edm::PileUp::beginJob ( void  )

Definition at line 165 of file PileUp.cc.

References input_, productRegistry_, and provider_.

165  {
166  input_->doBeginJob();
167  if (provider_.get() != nullptr) {
168  provider_->beginJob(*productRegistry_);
169  }
170  }
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:99
boost::shared_ptr< ProductRegistry > productRegistry_
Definition: PileUp.h:98
void edm::PileUp::beginLuminosityBlock ( const edm::LuminosityBlock lumi,
const edm::EventSetup setup 
)

Definition at line 186 of file PileUp.cc.

References printConversionInfo::aux, edm::LuminosityBlock::luminosityBlockAuxiliary(), lumiPrincipal_, edm::LuminosityBlock::moduleCallingContext(), processConfiguration_, productRegistry_, provider_, and runPrincipal_.

186  {
187  if (provider_.get() != nullptr) {
188  boost::shared_ptr<LuminosityBlockAuxiliary> aux(new LuminosityBlockAuxiliary(lumi.luminosityBlockAuxiliary()));
189  lumiPrincipal_.reset(new LuminosityBlockPrincipal(aux, productRegistry_, *processConfiguration_, nullptr, 0));
190  lumiPrincipal_->setRunPrincipal(runPrincipal_);
191  provider_->beginLuminosityBlock(*lumiPrincipal_, setup, lumi.moduleCallingContext());
192  }
193  }
boost::shared_ptr< RunPrincipal > runPrincipal_
Definition: PileUp.h:103
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
ModuleCallingContext const * moduleCallingContext() const
boost::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal_
Definition: PileUp.h:102
LuminosityBlockAuxiliary const & luminosityBlockAuxiliary() const
boost::shared_ptr< ProductRegistry > productRegistry_
Definition: PileUp.h:98
boost::shared_ptr< ProcessConfiguration > processConfiguration_
Definition: PileUp.h:100
void edm::PileUp::beginRun ( const edm::Run run,
const edm::EventSetup setup 
)

Definition at line 179 of file PileUp.cc.

References printConversionInfo::aux, edm::Run::moduleCallingContext(), processConfiguration_, productRegistry_, provider_, edm::Run::runAuxiliary(), and runPrincipal_.

179  {
180  if (provider_.get() != nullptr) {
181  boost::shared_ptr<RunAuxiliary> aux(new RunAuxiliary(run.runAuxiliary()));
182  runPrincipal_.reset(new RunPrincipal(aux, productRegistry_, *processConfiguration_, nullptr, 0));
183  provider_->beginRun(*runPrincipal_, setup, run.moduleCallingContext());
184  }
185  }
boost::shared_ptr< RunPrincipal > runPrincipal_
Definition: PileUp.h:103
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
boost::shared_ptr< ProductRegistry > productRegistry_
Definition: PileUp.h:98
RunAuxiliary const & runAuxiliary() const
Definition: Run.h:55
boost::shared_ptr< ProcessConfiguration > processConfiguration_
Definition: PileUp.h:100
ModuleCallingContext const * moduleCallingContext() const
Definition: Run.h:135
void edm::PileUp::CalculatePileup ( int  MinBunch,
int  MaxBunch,
std::vector< int > &  PileupSelection,
std::vector< float > &  TrueNumInteractions,
StreamID const &  streamID 
)

Definition at line 359 of file PileUp.cc.

References averageNumber_, fixed_, histo_, histoDistribution_, intAverage_, intFixed_ITPU_, intFixed_OOT_, manage_OOT_, none_, poisson_, poisson_OOT_, poissonDistr_OOT(), poissonDistribution(), probFunctionDistribution_, PU_Study_, and Study_type_.

359  {
360 
361  // if we are managing the distribution of out-of-time pileup separately, select the distribution for bunch
362  // crossing zero first, save it for later.
363 
364  int nzero_crossing = -1;
365  double Fnzero_crossing = -1;
366 
367  if(manage_OOT_) {
368  if (none_){
369  nzero_crossing = 0;
370  }else if (poisson_){
371  nzero_crossing = poissonDistribution(streamID)->fire() ;
372  }else if (fixed_){
373  nzero_crossing = intAverage_ ;
375  // RANDOM_NUMBER_ERROR
376  // Random number should be generated by the engines from the
377  // RandomNumberGeneratorService. This appears to use the global
378  // engine in ROOT. This is not thread safe unless the module using
379  // it is a one module and declares a shared resource and all
380  // other modules using it also declare the same shared resource.
381  // This also breaks replay.
382  double d = histo_->GetRandom();
383  //n = (int) floor(d + 0.5); // incorrect for bins with integer edges
384  Fnzero_crossing = d;
385  nzero_crossing = int(d);
386  }
387 
388  }
389 
390  for(int bx = MinBunch; bx < MaxBunch+1; ++bx) {
391 
392  if(manage_OOT_) {
393  if(bx==0 && !poisson_OOT_) {
394  PileupSelection.push_back(nzero_crossing) ;
395  TrueNumInteractions.push_back( nzero_crossing );
396  }
397  else{
398  if(poisson_OOT_) {
399  if(PU_Study_ && (Study_type_ == "Fixed_ITPU_Vary_OOTPU" ) && bx==0 ) {
400  PileupSelection.push_back(intFixed_ITPU_) ;
401  }
402  else{
403  PileupSelection.push_back(poissonDistr_OOT(streamID)->fire(Fnzero_crossing)) ;
404  }
405  TrueNumInteractions.push_back( Fnzero_crossing );
406  }
407  else {
408  PileupSelection.push_back(intFixed_OOT_) ;
409  TrueNumInteractions.push_back( intFixed_OOT_ );
410  }
411  }
412  }
413  else {
414  if (none_){
415  PileupSelection.push_back(0);
416  TrueNumInteractions.push_back( 0. );
417  }else if (poisson_){
418  PileupSelection.push_back(poissonDistribution(streamID)->fire());
419  TrueNumInteractions.push_back( averageNumber_ );
420  }else if (fixed_){
421  PileupSelection.push_back(intAverage_);
422  TrueNumInteractions.push_back( intAverage_ );
424  // RANDOM_NUMBER_ERROR
425  // Random number should be generated by the engines from the
426  // RandomNumberGeneratorService. This appears to use the global
427  // engine in ROOT. This is not thread safe unless the module using
428  // it is a one module and declares a shared resource and all
429  // other modules using it also declare the same shared resource.
430  // This also breaks replay.
431  double d = histo_->GetRandom();
432  PileupSelection.push_back(int(d));
433  TrueNumInteractions.push_back( d );
434  }
435  }
436 
437  }
438  }
bool manage_OOT_
Definition: PileUp.h:88
TH1F * histo_
Definition: PileUp.h:82
bool fixed_
Definition: PileUp.h:86
int const intAverage_
Definition: PileUp.h:81
bool probFunctionDistribution_
Definition: PileUp.h:84
std::string Study_type_
Definition: PileUp.h:93
bool histoDistribution_
Definition: PileUp.h:83
bool poisson_
Definition: PileUp.h:85
bool poisson_OOT_
Definition: PileUp.h:89
int intFixed_ITPU_
Definition: PileUp.h:96
std::unique_ptr< CLHEP::RandPoissonQ > const & poissonDistribution(StreamID const &streamID)
Definition: PileUp.cc:313
bool PU_Study_
Definition: PileUp.h:92
std::unique_ptr< CLHEP::RandPoisson > const & poissonDistr_OOT(StreamID const &streamID)
Definition: PileUp.cc:328
bool none_
Definition: PileUp.h:87
int intFixed_OOT_
Definition: PileUp.h:95
double averageNumber_
Definition: PileUp.h:80
bool edm::PileUp::doPileUp ( )
inline

Definition at line 46 of file PileUp.h.

References averageNumber_, and none_.

46 {return none_ ? false : averageNumber_>0.;}
bool none_
Definition: PileUp.h:87
double averageNumber_
Definition: PileUp.h:80
void edm::PileUp::dropUnwantedBranches ( std::vector< std::string > const &  wantedBranches)
inline

Definition at line 47 of file PileUp.h.

References input_.

47  {
48  input_->dropUnwantedBranches(wantedBranches);
49  }
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:99
void edm::PileUp::endJob ( void  )

Definition at line 172 of file PileUp.cc.

References input_, and provider_.

172  {
173  if (provider_.get() != nullptr) {
174  provider_->endJob();
175  }
176  input_->doEndJob();
177  }
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:99
void edm::PileUp::endLuminosityBlock ( const edm::LuminosityBlock lumi,
const edm::EventSetup setup 
)

Definition at line 200 of file PileUp.cc.

References lumiPrincipal_, edm::LuminosityBlock::moduleCallingContext(), and provider_.

200  {
201  if (provider_.get() != nullptr) {
202  provider_->endLuminosityBlock(*lumiPrincipal_, setup, lumi.moduleCallingContext());
203  }
204  }
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
ModuleCallingContext const * moduleCallingContext() const
boost::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal_
Definition: PileUp.h:102
void edm::PileUp::endRun ( const edm::Run run,
const edm::EventSetup setup 
)

Definition at line 195 of file PileUp.cc.

References edm::Run::moduleCallingContext(), provider_, and runPrincipal_.

195  {
196  if (provider_.get() != nullptr) {
197  provider_->endRun(*runPrincipal_, setup, run.moduleCallingContext());
198  }
199  }
boost::shared_ptr< RunPrincipal > runPrincipal_
Definition: PileUp.h:103
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
ModuleCallingContext const * moduleCallingContext() const
Definition: Run.h:135
const unsigned int& edm::PileUp::input ( ) const
inline

Definition at line 69 of file PileUp.h.

References inputType_.

69 {return inputType_;}
unsigned int inputType_
Definition: PileUp.h:78
void edm::PileUp::input ( unsigned int  s)
inline

Definition at line 70 of file PileUp.h.

References inputType_, and alignCSCRings::s.

70 {inputType_=s;}
unsigned int inputType_
Definition: PileUp.h:78
template<typename T >
void edm::PileUp::playPileUp ( const std::vector< edm::EventID > &  ids,
T  eventOperator 
)

Definition at line 199 of file PileUp.h.

References eventPrincipal_, and input_.

199  {
200  //TrueNumInteractions.push_back( ids.size() ) ;
201  input_->loopSpecified(*eventPrincipal_,ids,eventOperator);
202  }
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:99
std::unique_ptr< EventPrincipal > eventPrincipal_
Definition: PileUp.h:101
bool edm::PileUp::poisson ( ) const
inline

Definition at line 45 of file PileUp.h.

References poisson_.

45 {return poisson_;}
bool poisson_
Definition: PileUp.h:85
std::unique_ptr< CLHEP::RandPoisson > const & edm::PileUp::poissonDistr_OOT ( StreamID const &  streamID)
private

Definition at line 328 of file PileUp.cc.

References cmsHarvester::index, randomEngine(), edm::StreamID::value(), and vPoissonDistr_OOT_.

Referenced by CalculatePileup().

328  {
329  unsigned int index = streamID.value();
330  if(index >= vPoissonDistr_OOT_.size()) {
331  // This resizing is not thread safe and only works because
332  // this is used by a "one" type module
333  vPoissonDistr_OOT_.resize(index + 1);
334  }
335  std::unique_ptr<CLHEP::RandPoisson>& ptr = vPoissonDistr_OOT_[index];
336  if(!ptr) {
337  CLHEP::HepRandomEngine& engine = *randomEngine(streamID);
338  ptr.reset(new CLHEP::RandPoisson(engine));
339  }
340  return ptr;
341  }
CLHEP::HepRandomEngine * randomEngine(StreamID const &streamID)
Definition: PileUp.cc:343
std::vector< std::unique_ptr< CLHEP::RandPoisson > > vPoissonDistr_OOT_
Definition: PileUp.h:106
std::unique_ptr< CLHEP::RandPoissonQ > const & edm::PileUp::poissonDistribution ( StreamID const &  streamID)
private

Definition at line 313 of file PileUp.cc.

References averageNumber_, cmsHarvester::index, randomEngine(), edm::StreamID::value(), and vPoissonDistribution_.

Referenced by CalculatePileup().

313  {
314  unsigned int index = streamID.value();
315  if(index >= vPoissonDistribution_.size()) {
316  // This resizing is not thread safe and only works because
317  // this is used by a "one" type module
318  vPoissonDistribution_.resize(index + 1);
319  }
320  std::unique_ptr<CLHEP::RandPoissonQ>& ptr = vPoissonDistribution_[index];
321  if(!ptr) {
322  CLHEP::HepRandomEngine& engine = *randomEngine(streamID);
323  ptr.reset(new CLHEP::RandPoissonQ(engine, averageNumber_));
324  }
325  return ptr;
326  }
std::vector< std::unique_ptr< CLHEP::RandPoissonQ > > vPoissonDistribution_
Definition: PileUp.h:105
CLHEP::HepRandomEngine * randomEngine(StreamID const &streamID)
Definition: PileUp.cc:343
double averageNumber_
Definition: PileUp.h:80
CLHEP::HepRandomEngine * edm::PileUp::randomEngine ( StreamID const &  streamID)
private

Definition at line 343 of file PileUp.cc.

References cmsHarvester::index, randomEngines_, and edm::StreamID::value().

Referenced by poissonDistr_OOT(), poissonDistribution(), and readPileUp().

343  {
344  unsigned int index = streamID.value();
345  if(index >= randomEngines_.size()) {
346  // This resizing is not thread safe and only works because
347  // this is used by a "one" type module
348  randomEngines_.resize(index + 1, nullptr);
349  }
350  CLHEP::HepRandomEngine* ptr = randomEngines_[index];
351  if(!ptr) {
353  ptr = &rng->getEngine(streamID);
354  randomEngines_[index] = ptr;
355  }
356  return ptr;
357  }
std::vector< CLHEP::HepRandomEngine * > randomEngines_
Definition: PileUp.h:107
template<typename T >
void edm::PileUp::readPileUp ( edm::EventID const &  signal,
std::vector< edm::EventID > &  ids,
T  eventOperator,
const int  pileEventCnt,
StreamID const &  streamID 
)

Generates events from a VectorInputSource. This function decides which method of VectorInputSource to call: sequential, random, or pre-specified. The ids are either ids to read or ids to store while reading. eventOperator has a type that matches the eventOperator in VectorInputSource::loopRandom.

The "signal" event is optionally used to restrict the secondary events used for pileup and mixing.

Definition at line 157 of file PileUp.h.

References eventPrincipal_, input_, fjr2json::lumi, edm::EventID::luminosityBlock(), randomEngine(), SiPixelLorentzAngle_cfi::read, edm::EventID::run(), samelumi_, and sequential_.

158  {
159 
160  // One reason PileUp is responsible for recording event IDs is
161  // that it is the one that knows how many events will be read.
162  ids.reserve(pileEventCnt);
163  RecordEventID<T> recorder(ids,eventOperator);
164  int read;
165  if (samelumi_) {
166  const edm::LuminosityBlockID lumi(signal.run(), signal.luminosityBlock());
167  if (sequential_)
168  read = input_->loopSequentialWithID(*eventPrincipal_, lumi, pileEventCnt, recorder);
169  else
170  read = input_->loopRandomWithID(*eventPrincipal_, lumi, pileEventCnt, recorder, randomEngine(streamID));
171  } else {
172  if (sequential_) {
173  // boost::bind creates a functor from recordEventForPlayback
174  // so that recordEventForPlayback can insert itself before
175  // the original eventOperator.
176 
177  read = input_->loopSequential(*eventPrincipal_, pileEventCnt, recorder);
178  //boost::bind(&PileUp::recordEventForPlayback<T>,
179  // boost::ref(*this), _1, boost::ref(ids),
180  // boost::ref(eventOperator))
181  // );
182 
183  } else {
184  read = input_->loopRandom(*eventPrincipal_, pileEventCnt, recorder, randomEngine(streamID));
185  // boost::bind(&PileUp::recordEventForPlayback<T>,
186  // boost::ref(*this), _1, boost::ref(ids),
187  // boost::ref(eventOperator))
188  // );
189  }
190  }
191  if (read != pileEventCnt)
192  edm::LogWarning("PileUp") << "Could not read enough pileup events: only " << read << " out of " << pileEventCnt << " requested.";
193  }
tuple lumi
Definition: fjr2json.py:35
bool samelumi_
Definition: PileUp.h:120
std::unique_ptr< VectorInputSource > const input_
Definition: PileUp.h:99
bool sequential_
Definition: PileUp.h:117
CLHEP::HepRandomEngine * randomEngine(StreamID const &streamID)
Definition: PileUp.cc:343
std::unique_ptr< EventPrincipal > eventPrincipal_
Definition: PileUp.h:101
void edm::PileUp::reload ( const edm::EventSetup setup)

Definition at line 215 of file PileUp.cc.

References MixingInputConfig::averageNumber(), averageNumber(), averageNumber_, HDQMDatabaseProducer::config, alignCSCRings::e, edm::hlt::Exception, fixed_, fixed_OOT_, MixingInputConfig::fixedOutOfTime(), edm::EventSetup::get(), histo_, histoDistribution_, i, inputType_, intFixed_OOT_, j, LogDebug, manage_OOT_, none_, MixingInputConfig::outOfTime(), poisson_, poisson_OOT_, probFunctionDistribution_, MixingInputConfig::probFunctionVariable(), MixingInputConfig::probValue(), MixingInputConfig::type(), type_, vPoissonDistribution_, SiStripMonitorClusterAlca_cfi::xmax, and SiStripMonitorClusterAlca_cfi::xmin.

215  {
216  //get the required parameters from DB.
218  setup.get<MixingRcd>().get(configM);
219 
220  const MixingInputConfig & config=configM->config(inputType_);
221 
222  //get the type
223  type_=config.type();
224  //set booleans
225  histoDistribution_=type_ == "histo";
226  probFunctionDistribution_=type_ == "probFunction";
227  poisson_=type_ == "poisson";
228  fixed_=type_ == "fixed";
229  none_=type_ == "none";
230 
231  if (histoDistribution_) edm::LogError("MisConfiguration")<<"type histo cannot be reloaded from DB, yet";
232 
233  if (fixed_){
235  }
236  else if (poisson_)
237  {
238  averageNumber_=config.averageNumber();
239  for(auto & distribution : vPoissonDistribution_) {
240  if(distribution) {
241  distribution.reset(new CLHEP::RandPoissonQ(distribution->engine(), averageNumber_));
242  }
243  }
244  }
245  else if (probFunctionDistribution_)
246  {
247  //need to reload the histogram from DB
248  const std::vector<int> & dataProbFunctionVar = config.probFunctionVariable();
249  std::vector<double> dataProb = config.probValue();
250 
251  int varSize = (int) dataProbFunctionVar.size();
252  int probSize = (int) dataProb.size();
253 
254  if ((dataProbFunctionVar[0] != 0) || (dataProbFunctionVar[varSize - 1] != (varSize - 1)))
255  throw cms::Exception("BadProbFunction") << "Please, check the variables of the probability function! The first variable should be 0 and the difference between two variables should be 1." << std::endl;
256 
257  // Complete the vector containing the probability function data
258  // with the values "0"
259  if (probSize < varSize){
260  edm::LogWarning("MixingModule") << " The probability function data will be completed with " <<(varSize - probSize) <<" values 0.";
261 
262  for (int i=0; i<(varSize - probSize); i++) dataProb.push_back(0);
263 
264  probSize = dataProb.size();
265  edm::LogInfo("MixingModule") << " The number of the P(x) data set after adding the values 0 is " << probSize;
266  }
267 
268  // Create an histogram with the data from the probability function provided by the user
269  int xmin = (int) dataProbFunctionVar[0];
270  int xmax = (int) dataProbFunctionVar[varSize-1]+1; // need upper edge to be one beyond last value
271  int numBins = varSize;
272 
273  edm::LogInfo("MixingModule") << "An histogram will be created with " << numBins << " bins in the range ("<< xmin << "," << xmax << ")." << std::endl;
274 
275  if (histo_) delete histo_;
276  histo_ = new TH1F("h","Histo from the user's probability function",numBins,xmin,xmax);
277 
278  LogDebug("MixingModule") << "Filling histogram with the following data:" << std::endl;
279 
280  for (int j=0; j < numBins ; j++){
281  LogDebug("MixingModule") << " x = " << dataProbFunctionVar[j ]<< " P(x) = " << dataProb[j];
282  histo_->Fill(dataProbFunctionVar[j]+0.5,dataProb[j]); // assuming integer values for the bins, fill bin centers, not edges
283  }
284 
285  // Check if the histogram is normalized
286  if ( ((histo_->Integral() - 1) > 1.0e-02) && ((histo_->Integral() - 1) < -1.0e-02)){
287  throw cms::Exception("BadProbFunction") << "The probability function should be normalized!!! " << std::endl;
288  }
289  averageNumber_=histo_->GetMean();
290  }
291 
292  int oot=config.outOfTime();
293  manage_OOT_=false;
294  if (oot==1)
295  {
296  manage_OOT_=true;
297  poisson_OOT_ = false;
298  fixed_OOT_ = true;
299  intFixed_OOT_=config.fixedOutOfTime();
300  }
301  else if (oot==2)
302  {
303  manage_OOT_=true;
304  poisson_OOT_ = true;
305  fixed_OOT_ = false;
306  }
307 
308 
309  }
#define LogDebug(id)
bool manage_OOT_
Definition: PileUp.h:88
int i
Definition: DBlmapReader.cc:9
unsigned int inputType_
Definition: PileUp.h:78
const int fixedOutOfTime() const
TH1F * histo_
Definition: PileUp.h:82
bool fixed_
Definition: PileUp.h:86
const std::vector< double > & probValue() const
const double averageNumber() const
bool probFunctionDistribution_
Definition: PileUp.h:84
bool histoDistribution_
Definition: PileUp.h:83
bool poisson_
Definition: PileUp.h:85
double averageNumber() const
Definition: PileUp.h:44
const int outOfTime() const
std::vector< std::unique_ptr< CLHEP::RandPoissonQ > > vPoissonDistribution_
Definition: PileUp.h:105
bool poisson_OOT_
Definition: PileUp.h:89
int j
Definition: DBlmapReader.cc:9
bool fixed_OOT_
Definition: PileUp.h:90
std::string type_
Definition: PileUp.h:79
const T & get() const
Definition: EventSetup.h:55
const std::vector< int > & probFunctionVariable() const
bool none_
Definition: PileUp.h:87
int intFixed_OOT_
Definition: PileUp.h:95
std::string type() const
double averageNumber_
Definition: PileUp.h:80
void edm::PileUp::setupPileUpEvent ( const edm::EventSetup setup)

Definition at line 206 of file PileUp.cc.

References eventPrincipal_, lumiPrincipal_, and provider_.

206  {
207  if (provider_.get() != nullptr) {
208  // note: run and lumi numbers must be modified to match lumiPrincipal_
209  eventPrincipal_->setLuminosityBlockPrincipal(lumiPrincipal_);
210  eventPrincipal_->setRunAndLumiNumber(lumiPrincipal_->run(), lumiPrincipal_->luminosityBlock());
211  provider_->setupPileUpEvent(*eventPrincipal_, setup);
212  }
213  }
std::unique_ptr< SecondaryEventProvider > provider_
Definition: PileUp.h:104
boost::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal_
Definition: PileUp.h:102
std::unique_ptr< EventPrincipal > eventPrincipal_
Definition: PileUp.h:101

Member Data Documentation

double edm::PileUp::averageNumber_
private

Definition at line 80 of file PileUp.h.

Referenced by averageNumber(), CalculatePileup(), doPileUp(), poissonDistribution(), and reload().

std::unique_ptr<EventPrincipal> edm::PileUp::eventPrincipal_
private

Definition at line 101 of file PileUp.h.

Referenced by PileUp(), playPileUp(), readPileUp(), and setupPileUpEvent().

bool edm::PileUp::fixed_
private

Definition at line 86 of file PileUp.h.

Referenced by CalculatePileup(), PileUp(), and reload().

bool edm::PileUp::fixed_OOT_
private

Definition at line 90 of file PileUp.h.

Referenced by PileUp(), and reload().

TH1F* edm::PileUp::h1f
private

Definition at line 109 of file PileUp.h.

TH1F* edm::PileUp::histo_
private

Definition at line 82 of file PileUp.h.

Referenced by CalculatePileup(), and reload().

bool edm::PileUp::histoDistribution_
private

Definition at line 83 of file PileUp.h.

Referenced by CalculatePileup(), PileUp(), and reload().

TH1F* edm::PileUp::hprobFunction
private

Definition at line 110 of file PileUp.h.

std::unique_ptr<VectorInputSource> const edm::PileUp::input_
private

Definition at line 99 of file PileUp.h.

Referenced by beginJob(), dropUnwantedBranches(), endJob(), PileUp(), playPileUp(), and readPileUp().

unsigned int edm::PileUp::inputType_
private

Definition at line 78 of file PileUp.h.

Referenced by input(), and reload().

int const edm::PileUp::intAverage_
private

Definition at line 81 of file PileUp.h.

Referenced by CalculatePileup().

int edm::PileUp::intFixed_ITPU_
private

Definition at line 96 of file PileUp.h.

Referenced by CalculatePileup(), and PileUp().

int edm::PileUp::intFixed_OOT_
private

Definition at line 95 of file PileUp.h.

Referenced by CalculatePileup(), PileUp(), and reload().

boost::shared_ptr<LuminosityBlockPrincipal> edm::PileUp::lumiPrincipal_
private

Definition at line 102 of file PileUp.h.

Referenced by beginLuminosityBlock(), endLuminosityBlock(), and setupPileUpEvent().

bool edm::PileUp::manage_OOT_
private

Definition at line 88 of file PileUp.h.

Referenced by CalculatePileup(), PileUp(), and reload().

bool edm::PileUp::none_
private

Definition at line 87 of file PileUp.h.

Referenced by CalculatePileup(), doPileUp(), PileUp(), and reload().

bool edm::PileUp::playback_
private

Definition at line 114 of file PileUp.h.

bool edm::PileUp::poisson_
private

Definition at line 85 of file PileUp.h.

Referenced by CalculatePileup(), PileUp(), poisson(), and reload().

bool edm::PileUp::poisson_OOT_
private

Definition at line 89 of file PileUp.h.

Referenced by CalculatePileup(), PileUp(), and reload().

TFile* edm::PileUp::probFileHisto
private

Definition at line 111 of file PileUp.h.

bool edm::PileUp::probFunctionDistribution_
private

Definition at line 84 of file PileUp.h.

Referenced by CalculatePileup(), PileUp(), and reload().

boost::shared_ptr<ProcessConfiguration> edm::PileUp::processConfiguration_
private

Definition at line 100 of file PileUp.h.

Referenced by beginLuminosityBlock(), beginRun(), and PileUp().

boost::shared_ptr<ProductRegistry> edm::PileUp::productRegistry_
private

Definition at line 98 of file PileUp.h.

Referenced by beginJob(), beginLuminosityBlock(), beginRun(), and PileUp().

std::unique_ptr<SecondaryEventProvider> edm::PileUp::provider_
private
bool edm::PileUp::PU_Study_
private

Definition at line 92 of file PileUp.h.

Referenced by CalculatePileup(), and PileUp().

std::vector<CLHEP::HepRandomEngine*> edm::PileUp::randomEngines_
private

Definition at line 107 of file PileUp.h.

Referenced by randomEngine().

boost::shared_ptr<RunPrincipal> edm::PileUp::runPrincipal_
private

Definition at line 103 of file PileUp.h.

Referenced by beginLuminosityBlock(), beginRun(), and endRun().

bool edm::PileUp::samelumi_
private

Definition at line 120 of file PileUp.h.

Referenced by readPileUp().

int edm::PileUp::seed_
private

Definition at line 123 of file PileUp.h.

Referenced by PileUp().

bool edm::PileUp::sequential_
private

Definition at line 117 of file PileUp.h.

Referenced by readPileUp().

std::string edm::PileUp::Study_type_
private

Definition at line 93 of file PileUp.h.

Referenced by CalculatePileup(), and PileUp().

std::string edm::PileUp::type_
private
std::vector<std::unique_ptr<CLHEP::RandPoisson> > edm::PileUp::vPoissonDistr_OOT_
private

Definition at line 106 of file PileUp.h.

Referenced by poissonDistr_OOT().

std::vector<std::unique_ptr<CLHEP::RandPoissonQ> > edm::PileUp::vPoissonDistribution_
private

Definition at line 105 of file PileUp.h.

Referenced by poissonDistribution(), and reload().