53 produces< std::vector< sim::MCHitCollection> >();
55 produces< std::vector< sim::MCWireCollection> >();
67 const unsigned int nch = geo->
Nchannels();
69 std::unique_ptr< std::vector<sim::MCHitCollection> > hits_v (
new std::vector<sim::MCHitCollection>() );
70 std::unique_ptr< std::vector<sim::MCWireCollection> > wires_v (
new std::vector<sim::MCWireCollection>() );
73 wires_v->reserve(nch);
74 for(
size_t ch=0; ch<nch; ++ch) {
85 <<
"Did not find sim::SimChannel with a label: " <<
fLArG4ModuleName.c_str() << std::endl;
88 for(
size_t simch_index=0; simch_index<simchArray->size(); ++simch_index) {
92 size_t ch = simch_ptr->
Channel();
94 if(ch >= hits_v->size())
97 <<
"Channel number " << ch <<
" exceeds total # of channels: " << nch << std::endl;
99 auto &mchits = hits_v->at(ch);
100 auto &mcwires = wires_v->at(ch);
102 std::map<sim::MCEnDep,sim::MCWire> edep_wire_map;
103 auto tdc_ide_map = simch_ptr->
TDCIDEMap();
113 std::cout<<std::endl<<
"Processing Ch: "<<ch<<std::endl;
115 for(
auto const& tdc_ide_pair : tdc_ide_map) {
117 auto const& tdc = tdc_ide_pair.first;
118 auto const& ide_v = tdc_ide_pair.second;
120 for(
auto const& ide : ide_v) {
129 auto edep_iter = edep_wire_map.insert(std::make_pair(edep,wire));
133 auto last_tdc = (edep_iter).first->second.StartTDC() + (edep_iter).first->second.size() - 1;
137 if( edep_iter.second ) std::cout<<std::endl;
139 std::cout<<
" Track: "<<ide.trackID
140 <<
" Vtx: " <<ide.x <<
" " << ide.y <<
" " <<ide.z <<
" " <<ide.energy
141 <<
" ... @ TDC = "<<tdc<<
" ... "<<ide.numElectrons << std::endl;
144 if( !(edep_iter.second) ) {
146 if( last_tdc+1 != tdc ) {
158 (edep_iter).first->second.push_back(ide.numElectrons);
165 for(
auto const& edep_wire_pair : edep_wire_map) {
167 auto const&
edep = edep_wire_pair.first;
168 auto const& wire = edep_wire_pair.second;
172 float vtx[3] = {float(
edep.Vertex()[0]),
173 float(
edep.Vertex()[1]),
174 float(
edep.Vertex()[2])};
180 for(
size_t wire_index=0; wire_index < wire.size(); ++wire_index) {
182 auto q = wire.at(wire_index);
186 if( q > qmax) { qmax = q; max_time = wire.StartTDC() + wire_index; }
192 mchits.push_back(hit);
196 mcwires.push_back(wire);
202 std::sort((*hits_v).begin(),(*hits_v).end());
203 e.
put(std::move(hits_v));
206 std::sort((*wires_v).begin(),(*wires_v).end());
207 e.
put(std::move(wires_v));
void SetCharge(float qsum, float amp)
Setter function for charge/amplitude.
void SetParticleInfo(const float vtx[], const float energy, const int trackId)
Setter function for partile info.
void SetTime(const float peak, const float width)
Setter function for time.
void SetStartTDC(const unsigned int start)
Setter function for time.
void produce(art::Event &e) override
void SetTrackId(unsigned int id)
unsigned int Nchannels() const
Returns the number of TPC readout channels in the detector.
ProductID put(std::unique_ptr< PROD > &&product)
#define DEFINE_ART_MODULE(klass)
T get(std::string const &key) const
void SetVertex(float x, float y, float z)
std::string fLArG4ModuleName
Detector simulation of raw signals on wires.
raw::ChannelID_t Channel() const
Returns the readout channel this object describes.
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
object containing MC truth information necessary for making RawDigits and doing back tracking ...
TDCIDEs_t const & TDCIDEMap() const
Returns all the deposited energy information as stored.
bool removeCachedProduct(Handle< PROD > &h) const
MCHitFinder(fhicl::ParameterSet const &p)
Namespace collecting geometry-related classes utilities.
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception