CMS 3D CMS Logo

SubsystemNeutronReader.cc
Go to the documentation of this file.
4 #include "CLHEP/Random/RandFlat.h"
5 #include "CLHEP/Random/RandPoissonQ.h"
9 #include <algorithm>
10 
11 using namespace std;
12 
14 : theHitReader(nullptr),
15  theLuminosity(pset.getParameter<double>("luminosity")), // in units of 10^34
16  theStartTime(pset.getParameter<double>("startTime")),
17  theEndTime(pset.getParameter<double>("endTime")),
18  theEventOccupancy(pset.getParameter<vector<double> >("eventOccupancy")) // TODO make map
19 {
20  // 17.3 collisions per live bx, 79.5% of bx live
21  float collisionsPerCrossing = 13.75 * theLuminosity;
22  int windowSize = (int)((theEndTime-theStartTime)/25.);
23  theEventsInWindow = collisionsPerCrossing * windowSize;
24  string reader = pset.getParameter<string>("reader");
26  if(reader == "ASCII")
27  {
28  theHitReader = new AsciiNeutronReader(input.fullPath());
29  }
30  else if (reader == "ROOT")
31  {
32  theHitReader = new RootNeutronReader(input.fullPath());
33  }
34 }
35 
36 
38  delete theHitReader;
39 }
40 
41 
42 void
43 SubsystemNeutronReader::generateChamberNoise(int chamberType, int chamberIndex,
45  CLHEP::HepRandomEngine* engine)
46 {
47  // make sure this chamber hasn't been done before
48  if(find(theChambersDone.begin(), theChambersDone.end(), chamberIndex)
49  == theChambersDone.end())
50  {
51  float meanNumberOfEvents = theEventOccupancy[chamberType-1]
53  CLHEP::RandPoissonQ randPoissonQ(*engine, meanNumberOfEvents);
54  int nEventsToAdd = randPoissonQ.fire();
55 // LogDebug("NeutronReader") << "Number of neutron events to add: "
56 //std::cout << "Number of neutron events to add for chamber type " << chamberType << " : "
57 // << nEventsToAdd << " mean " << meanNumberOfEvents << std::endl;
58 // << nEventsToAdd << " mean " << meanNumberOfEvents;
59 
60  for(int i = 0; i < nEventsToAdd; ++i) {
61  // find the time for this event
62  float timeOffset = CLHEP::RandFlat::shoot(engine, theStartTime, theEndTime);
63  vector<PSimHit> neutronHits;
64  theHitReader->readNextEvent(chamberType, neutronHits);
65 
66  for( vector<PSimHit>::const_iterator neutronHitItr = neutronHits.begin();
67  neutronHitItr != neutronHits.end(); ++neutronHitItr)
68  {
69  const PSimHit & rawHit = *neutronHitItr;
70  // do the time offset and local det id
71  int det = detId(chamberIndex, rawHit.detUnitId());
72  PSimHit hit(rawHit.entryPoint(), rawHit.exitPoint(), rawHit.pabs(),
73  rawHit.tof()+timeOffset,
74  rawHit.energyLoss(), rawHit.particleType(),
75  det, rawHit.trackId(),
76  rawHit.thetaAtEntry(), rawHit.phiAtEntry(), rawHit.processType());
77 //std::cout << "NEWHIT " << hit << std::endl;
78  result.push_back(hit);
79  }
80 
81  }
82  theChambersDone.push_back(chamberIndex);
83  }
84 }
85 
T getParameter(std::string const &) const
std::vector< double > theEventOccupancy
float tof() const
deprecated name for timeOfFlight()
Definition: PSimHit.h:72
Geom::Theta< float > thetaAtEntry() const
fast and more accurate access to momentumAtEntry().theta()
Definition: PSimHit.h:57
#define nullptr
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
static std::string const input
Definition: EdmProvDump.cc:45
SubsystemNeutronReader(const edm::ParameterSet &pset)
std::vector< int > theChambersDone
just makes sure chambers aren&#39;t done twice
Local3DPoint exitPoint() const
Exit point in the local Det frame.
Definition: PSimHit.h:38
void generateChamberNoise(int chamberType, int chamberIndex, edm::PSimHitContainer &result, CLHEP::HepRandomEngine *)
virtual int detId(int chamberIndex, int localDetId)=0
float pabs() const
fast and more accurate access to momentumAtEntry().mag()
Definition: PSimHit.h:63
float theEventsInWindow
how many collsions happened between theStartTime and theEndTime
unsigned short processType() const
Definition: PSimHit.h:118
virtual void readNextEvent(int chamberType, edm::PSimHitContainer &result)=0
float energyLoss() const
The energy deposit in the PSimHit, in ???.
Definition: PSimHit.h:75
int particleType() const
Definition: PSimHit.h:85
unsigned int trackId() const
Definition: PSimHit.h:102
Geom::Phi< float > phiAtEntry() const
fast and more accurate access to momentumAtEntry().phi()
Definition: PSimHit.h:60
std::vector< PSimHit > PSimHitContainer
Local3DPoint entryPoint() const
Entry point in the local Det frame.
Definition: PSimHit.h:35
float theLuminosity
in units of 10**34, set by Muon:NeutronLuminosity
unsigned int detUnitId() const
Definition: PSimHit.h:93