10 #include "CLHEP/Random/RandomEngine.h"
21 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.";
61 CLHEP::HepRandomEngine& engine = rng->
getEngine();
82 edm::LogInfo(
"SubsystemNeutronWriter") <<
"SubsystemNeutronWriter Statistics:\n";
85 edm::LogInfo(
"SubsystemNeutronWriter") <<
" theEventOccupancy[" << mapItr->first <<
"] = "
86 << mapItr->second <<
" / " <<
theNEvents <<
" / NCT \n";
99 map<int, edm::PSimHitContainer> hitsByChamber;
100 for(edm::PSimHitContainer::const_iterator hitItr = hits->begin();
101 hitItr != hits->end(); ++hitItr)
103 int chamberIndex =
chamberId(hitItr->detUnitId());
104 hitsByChamber[chamberIndex].push_back(*hitItr);
108 for(map<int, edm::PSimHitContainer>::iterator hitsByChamberItr = hitsByChamber.begin();
109 hitsByChamberItr != hitsByChamber.end(); ++hitsByChamberItr)
111 int chambertype =
chamberType(hitsByChamberItr->first);
112 writeHits(chambertype, hitsByChamberItr->second);
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()
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()
virtual int chamberType(int globalDetId) const =0
virtual ~SubsystemNeutronWriter()
destructor prints statistics on number of events written
void initialize(int chamberType)
good practice to do once for each chamber type
LocalVector momentumAtEntry() const
The momentum of the track that produced the hit, at entry point.
virtual bool accept(const edm::PSimHitContainer &cluster) const =0
decides whether this cluster is good enough to be included
Geom::Phi< T > phi() const
virtual void beginEvent(edm::Event &e, const edm::EventSetup &es)
void adjust(PSimHit &h, float timeOffset, float smearing)
helper to add time offsets and local det ID
Geom::Theta< T > theta() const
virtual int localDetId(int globalDetId) const =0
Local3DPoint exitPoint() const
Exit point in the local Det frame.
virtual int chamberId(int globalDetId) const =0
float timeOfFlight() const
edm::InputTag theInputTag
std::pair< std::string, MonitorElement * > entry
bool operator()(const PSimHit &h1, const PSimHit &h2)
std::map< int, int > theCountPerChamberType
virtual CLHEP::HepRandomEngine & getEngine() const =0
Use this to get the random number engine, this is the only function most users should call...
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
float energyLoss() const
The energy deposit in the PSimHit, in ???.
virtual void writeHits(int chamberType, edm::PSimHitContainer &chamberHits)
CLHEP::RandFlat * theRandFlat
unsigned int trackId() const
virtual void produce(edm::Event &e, edm::EventSetup const &c)
std::vector< PSimHit > PSimHitContainer
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Local3DPoint entryPoint() const
Entry point in the local Det frame.
unsigned int detUnitId() const