|
|
Go to the documentation of this file.
13 #include "CLHEP/Random/RandFlat.h"
25 : theHitWriter(nullptr),
28 theNeutronTimeCut(
pset.getParameter<double>(
"neutronTimeCut")),
29 theTimeWindow(
pset.getParameter<double>(
"timeWindow")),
30 theT0(
pset.getParameter<double>(
"t0")),
33 useLocalDetId_(
true) {
34 string writer =
pset.getParameter<
string>(
"writer");
35 string output =
pset.getParameter<
string>(
"output");
38 }
else if (
writer ==
"ROOT") {
40 }
else if (
writer ==
"EDM") {
41 produces<edm::PSimHitContainer>();
49 <<
"SubsystemNeutronWriter requires the RandomNumberGeneratorService\n"
50 "which is not present in the configuration file. You must add the service\n"
51 "in the configuration file or remove the modules that require it.";
65 edm::LogInfo(
"SubsystemNeutronWriter") <<
"SubsystemNeutronWriter Statistics:\n";
69 <<
" theEventOccupancy[" << mapItr->first <<
"] = " << mapItr->second <<
" / " <<
theNEvents <<
" / NCT \n";
74 CLHEP::HepRandomEngine* engine =
nullptr;
85 map<int, edm::PSimHitContainer> hitsByChamber;
86 for (edm::PSimHitContainer::const_iterator hitItr =
hits->begin(); hitItr !=
hits->end(); ++hitItr) {
87 int chamberIndex =
chamberId(hitItr->detUnitId());
88 hitsByChamber[chamberIndex].push_back(*hitItr);
92 for (map<int, edm::PSimHitContainer>::iterator hitsByChamberItr = hitsByChamber.begin();
93 hitsByChamberItr != hitsByChamber.end();
95 int chambertype =
chamberType(hitsByChamberItr->first);
96 writeHits(chambertype, hitsByChamberItr->second, engine);
109 CLHEP::HepRandomEngine* engine) {
110 sort(chamberHits.begin(), chamberHits.end(),
SortByTime());
112 float startTime = -1000.;
114 for (
size_t i = 0;
i < chamberHits.size(); ++
i) {
116 float tof =
hit.tof();
117 LogDebug(
"SubsystemNeutronWriter") <<
"found hit from part type " <<
hit.particleType() <<
" at tof " << tof
118 <<
" p " <<
hit.pabs() <<
" on det " <<
hit.detUnitId() <<
" chamber type "
126 smearing += CLHEP::RandFlat::shoot(engine, 25.);
128 if (!cluster.empty()) {
129 LogDebug(
"SubsystemNeutronWriter") <<
"filling old cluster";
134 <<
"starting neutron cluster at time " << startTime <<
" on detType " <<
chamberType;
137 cluster.push_back(
hit);
141 if (!cluster.empty()) {
155 float htime =
h.timeOfFlight() +
timeOffset + smearing;
157 if (
h.timeOfFlight() > 1.E+6) {
168 h.momentumAtEntry().theta(),
169 h.momentumAtEntry().phi());
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
bool operator()(const PSimHit &h1, const PSimHit &h2)
virtual void initialize(int detType)
void initialize(int chamberType)
good practice to do once for each chamber type
virtual void writeCluster(int detType, const edm::PSimHitContainer &simHits)=0
writes out a list of SimHits.
float tof() const
deprecated name for timeOfFlight()
~SubsystemNeutronWriter() override
destructor prints statistics on number of events written
virtual int localDetId(int globalDetId) const =0
virtual void beginEvent(edm::Event &e, const edm::EventSetup &es)
void writeCluster(int chamberType, const edm::PSimHitContainer &cluster)
virtual int chamberId(int globalDetId) const =0
virtual bool accept(const edm::PSimHitContainer &cluster) const =0
decides whether this cluster is good enough to be included
virtual int chamberType(int globalDetId) const =0
void updateCount(int chamberType)
updates the counter
virtual void writeHits(int chamberType, edm::PSimHitContainer &chamberHits, CLHEP::HepRandomEngine *)
SubsystemNeutronWriter(edm::ParameterSet const &pset)
void produce(edm::Event &e, edm::EventSetup const &c) override
std::map< int, int > theCountPerChamberType
edm::InputTag theInputTag
NeutronWriter * theHitWriter
std::vector< PSimHit > PSimHitContainer
void adjust(PSimHit &h, float timeOffset, float smearing)
helper to add time offsets and local det ID