10 #include "art/Framework/Core/EDProducer.h"
11 #include "art/Framework/Core/ModuleMacros.h"
12 #include "art/Framework/Principal/Event.h"
13 #include "art/Framework/Principal/Handle.h"
14 #include "art/Framework/Services/Registry/ServiceHandle.h"
15 #include "fhiclcpp/ParameterSet.h"
35 void produce(art::Event &
e)
override;
47 fLArG4ModuleName =
p.get<std::string>(
"LArG4ModuleName");
48 fMakeMCWire =
p.get<
bool>(
"MakeMCWire");
49 fVerbose =
p.get<
bool>(
"Verbose");
50 produces< std::vector< sim::MCHitCollection> >();
52 produces< std::vector< sim::MCWireCollection> >();
58 art::ServiceHandle<geo::Geometry const> geo;
60 const unsigned int nch = geo->Nchannels();
62 std::unique_ptr< std::vector<sim::MCHitCollection> > hits_v (
new std::vector<sim::MCHitCollection>() );
63 std::unique_ptr< std::vector<sim::MCWireCollection> > wires_v (
new std::vector<sim::MCWireCollection>() );
66 wires_v->reserve(nch);
67 for(
size_t ch=0; ch<nch; ++ch) {
74 art::Handle< std::vector<sim::SimChannel> > simchArray;
76 if(!simchArray.isValid())
77 throw cet::exception(__PRETTY_FUNCTION__)
78 <<
"Did not find sim::SimChannel with a label: " <<
fLArG4ModuleName.c_str() << std::endl;
81 for(
size_t simch_index=0; simch_index<simchArray->size(); ++simch_index) {
83 const art::Ptr<sim::SimChannel> simch_ptr(simchArray,simch_index);
85 size_t ch = simch_ptr->Channel();
87 if(ch >= hits_v->size())
89 throw cet::exception(__PRETTY_FUNCTION__)
90 <<
"Channel number " << ch <<
" exceeds total # of channels: " << nch << std::endl;
92 auto &mchits = hits_v->at(ch);
93 auto &mcwires = wires_v->at(ch);
95 std::map<sim::MCEnDep,sim::MCWire> edep_wire_map;
96 auto tdc_ide_map = simch_ptr->TDCIDEMap();
106 std::cout<<std::endl<<
"Processing Ch: "<<ch<<std::endl;
108 for(
auto const& tdc_ide_pair : tdc_ide_map) {
110 auto const& tdc = tdc_ide_pair.first;
111 auto const& ide_v = tdc_ide_pair.second;
113 for(
auto const& ide : ide_v) {
122 auto edep_iter = edep_wire_map.insert(std::make_pair(edep,wire));
126 auto last_tdc = (edep_iter).
first->second.StartTDC() + (edep_iter).
first->second.size() - 1;
130 if( edep_iter.second )
std::cout<<std::endl;
133 <<
" Vtx: " <<ide.x <<
" " << ide.y <<
" " <<ide.z <<
" " <<ide.energy
134 <<
" ... @ TDC = "<<tdc<<
" ... "<<ide.numElectrons << std::endl;
137 if( !(edep_iter.second) ) {
139 if( last_tdc+1 != tdc ) {
151 (edep_iter).
first->second.push_back(ide.numElectrons);
158 for(
auto const& edep_wire_pair : edep_wire_map) {
160 auto const& edep = edep_wire_pair.first;
161 auto const& wire = edep_wire_pair.second;
165 float vtx[3] = {float(edep.Vertex()[0]),
166 float(edep.Vertex()[1]),
167 float(edep.Vertex()[2])};
173 for(
size_t wire_index=0; wire_index < wire.size(); ++wire_index) {
175 auto q = wire.at(wire_index);
179 if(
q > qmax) { qmax =
q; max_time = wire.StartTDC() + wire_index; }
185 mchits.push_back(hit);
187 if(!fMakeMCWire)
continue;
189 mcwires.push_back(wire);
193 e.removeCachedProduct(simchArray);
195 std::sort((*hits_v).begin(),(*hits_v).end());
196 e.put(std::move(hits_v));
199 std::sort((*wires_v).begin(),(*wires_v).end());
200 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)
void SetVertex(float x, float y, float z)
std::string fLArG4ModuleName
object containing MC truth information necessary for making RawDigits and doing back tracking ...
MCHitFinder(fhicl::ParameterSet const &p)
art framework interface to geometry description
BEGIN_PROLOG could also be cout