13 #include "CLHEP/Random/RandFlat.h" 22 return (h1.
tof() < h2.
tof());
29 theInputTag(pset.getParameter<
edm::InputTag>(
"input")),
30 theNeutronTimeCut(pset.getParameter<double>(
"neutronTimeCut")),
31 theTimeWindow(pset.getParameter<double>(
"timeWindow")),
32 theT0(pset.getParameter<double>(
"t0")),
43 else if (writer ==
"ROOT")
47 else if (writer ==
"EDM")
49 produces<edm::PSimHitContainer>();
57 <<
"SubsystemNeutronWriter requires the RandomNumberGeneratorService\n" 58 "which is not present in the configuration file. You must add the service\n" 59 "in the configuration file or remove the modules that require it.";
77 edm::LogInfo(
"SubsystemNeutronWriter") <<
"SubsystemNeutronWriter Statistics:\n";
80 edm::LogInfo(
"SubsystemNeutronWriter") <<
" theEventOccupancy[" << mapItr->first <<
"] = " 81 << mapItr->second <<
" / " <<
theNEvents <<
" / NCT \n";
87 CLHEP::HepRandomEngine* engine =
nullptr;
98 map<int, edm::PSimHitContainer> hitsByChamber;
99 for(edm::PSimHitContainer::const_iterator hitItr = hits->begin();
100 hitItr != hits->end(); ++hitItr)
102 int chamberIndex =
chamberId(hitItr->detUnitId());
103 hitsByChamber[chamberIndex].push_back(*hitItr);
107 for(map<int, edm::PSimHitContainer>::iterator hitsByChamberItr = hitsByChamber.begin();
108 hitsByChamberItr != hitsByChamber.end(); ++hitsByChamberItr)
110 int chambertype =
chamberType(hitsByChamberItr->first);
111 writeHits(chambertype, hitsByChamberItr->second, engine);
126 CLHEP::HepRandomEngine* engine)
129 sort(chamberHits.begin(), chamberHits.end(),
SortByTime());
131 float startTime = -1000.;
133 for(
size_t i = 0;
i < chamberHits.size(); ++
i) {
135 float tof = hit.
tof();
137 <<
" at tof " << tof <<
" p " << hit.
pabs()
146 smearing += CLHEP::RandFlat::shoot(engine, 25.);
148 if(!cluster.empty()) {
149 LogDebug(
"SubsystemNeutronWriter") <<
"filling old cluster";
153 LogDebug(
"SubsystemNeutronWriter") <<
"starting neutron cluster at time " << startTime
156 adjust(hit, -1.*startTime, smearing);
157 cluster.push_back( hit );
161 if(!cluster.empty()) {
T getParameter(std::string const &) const
float tof() const
deprecated name for timeOfFlight()
void initialize(int chamberType)
good practice to do once for each chamber type
~SubsystemNeutronWriter() override
destructor prints statistics on number of events written
LocalVector momentumAtEntry() const
The momentum of the track that produced the hit, at entry point.
Geom::Phi< T > phi() const
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
virtual void beginEvent(edm::Event &e, const edm::EventSetup &es)
virtual bool accept(const edm::PSimHitContainer &cluster) const =0
decides whether this cluster is good enough to be included
void adjust(PSimHit &h, float timeOffset, float smearing)
helper to add time offsets and local det ID
Geom::Theta< T > theta() const
Local3DPoint exitPoint() const
Exit point in the local Det frame.
float timeOfFlight() const
virtual void writeHits(int chamberType, edm::PSimHitContainer &chamberHits, CLHEP::HepRandomEngine *)
edm::InputTag theInputTag
bool operator()(const PSimHit &h1, const PSimHit &h2)
std::map< int, int > theCountPerChamberType
virtual void writeCluster(int detType, const edm::PSimHitContainer &simHits)=0
writes out a list of SimHits.
float pabs() const
fast and more accurate access to momentumAtEntry().mag()
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
virtual void initialize(int detType)
SubsystemNeutronWriter(edm::ParameterSet const &pset)
void updateCount(int chamberType)
updates the counter
void writeCluster(int chamberType, const edm::PSimHitContainer &cluster)
NeutronWriter * theHitWriter
virtual int chamberId(int globalDetId) const =0
void produce(edm::Event &e, edm::EventSetup const &c) override
float energyLoss() const
The energy deposit in the PSimHit, in ???.
StreamID streamID() const
unsigned int trackId() const
std::vector< PSimHit > PSimHitContainer
virtual int chamberType(int globalDetId) const =0
Local3DPoint entryPoint() const
Entry point in the local Det frame.
virtual int localDetId(int globalDetId) const =0
unsigned int detUnitId() const