26 #include <TStopwatch.h> 30 class MCHitAnaExample;
142 for(
unsigned char plane=0; plane < geo->
Nplanes(); ++plane) {
144 hMCHitQ_v.push_back(fs->make<TH1D>(Form(
"hMCHitQ_%d",plane),
145 Form(
"MCHit Charge (Plane %d); Charge [ADC]; # MCHit",plane),
148 hMCHitMult_v.push_back(fs->make<TH1D>(Form(
"hMCHitMult_%d",plane),
149 Form(
"MCHit Multiplicity (Plane %d); Multiplicity; # MCHit",plane),
152 hRecoHitQ_v.push_back(fs->make<TH1D>(Form(
"hRecoHitQ_%d",plane),
153 Form(
"RecoHit Charge (Plane %d); Charge [ADC]; # RecoHits",plane),
156 hRecoHitMult_v.push_back(fs->make<TH1D>(Form(
"hRecoHitMult_%d",plane),
157 Form(
"RecoHit Multiplicity (Plane %d); Multiplicity; # RecoHits",plane),
160 hCorrMult_v.push_back(fs->make<TH2D>(Form(
"hCorrMult_%d",plane),
161 Form(
"# MCHits vs. # RecoHits (Plane %d); # MCHits; # RecoHits",plane),
165 hVoidHitQ_v.push_back(fs->make<TH1D>(Form(
"hVoidHitQ_%d",plane),
166 Form(
"RecoHit Charge (No Corresponding MCHit)) (Plane %d); Charge [ADC]; # RecoHits",plane),
169 hCorrQ_v.push_back(fs->make<TH2D>(Form(
"hCorrQ_%d",plane),
170 Form(
"RecoHit Q vs. Closest MCHit Q (Plane %d); MCHit Charge [ADC]; RecoHit Charge [ADC]",plane),
174 hCorrQSum_v.push_back(fs->make<TH2D>(Form(
"hCorrQSum_%d",plane),
175 Form(
"RecoHit Q vs. MCHit QSum Within Start=>End (Plane %d); MCHit Charge [ADC]; RecoHit Charge [ADC]",plane),
179 hQRatio_v.push_back(fs->make<TH1D>(Form(
"hQRatio_%d",plane),
180 Form(
"Reco/MCHit Charge (Plane %d); Ratio; # RecoHits",plane),
183 hQSumRatio_v.push_back(fs->make<TH1D>(Form(
"hQSumRatio_%d",plane),
184 Form(
"Reco/MCHit Charge (Plane %d); Ratio; # RecoHits",plane),
187 hDT_v.push_back(fs->make<TH1D>(Form(
"hDT_%d",plane),
188 Form(
"#DeltaT btw Reco and Closest MCHit (Plane %d); #DeltaT; # RecoHits",plane),
192 Form(
"MCHit Multiplicity per RecoHit (Plane %d); Multiplicity; # RecoHits",plane),
197 "Real Time to Read recob::Hit From Disk; Real Time [ms]; Events",
201 "Real Time to Read sim::MCHit From Disk; Real Time [ms]; Events",
205 "Analysis Time to Run analyze() Function; Real Time [ms]; Events",
209 "Time to Search Multiple sim::MCHit Per RecoHit; RealTime [us]; # RecoHit",
213 "Time to Search Multiple sim::MCHit for All RecoHit in Event; RealTime [ms]; # Event",
233 const std::vector<sim::MCHitCollection> &mchits_v = *mcHandle;
238 if(!recoHandle.
isValid())
throw cet::exception(__PRETTY_FUNCTION__) <<
"RecoHit not found!" << std::endl;
240 const std::vector<recob::Hit> &recohits = *recoHandle;
245 std::vector<size_t> mchit_mult(geo->
Nplanes(),0);
246 for(
auto const& mchits : mchits_v) {
248 auto plane = geo->
ChannelToWire(mchits.Channel()).at(0).Plane;
250 mchit_mult.at(plane) += mchits.size();
252 for(
auto const& mchit : mchits)
254 hMCHitQ_v.at(plane)->Fill(mchit.Charge(
true));
258 std::vector<size_t> recohit_mult(geo->
Nplanes(),0);
260 double search_time_sum = 0;
263 for(
size_t hit_index=0; hit_index<recohits.size(); ++hit_index) {
265 auto const &
hit = recohits.at(hit_index);
267 auto const &wire_id =
hit.WireID();
271 recohit_mult.at(wire_id.Plane) += 1;
279 if(mchits_v.size() <= ch )
281 <<
"Channel "<<ch<<
" not found in MCHit vector!"<<std::endl;
284 auto const& mchits = mchits_v.at(ch);
286 if( ch != mchits.Channel() )
288 <<
"MCHit channel & vector index mismatch: " 289 << mchits.Channel() <<
" != " << ch << std::endl;
299 auto start_iter = std::lower_bound ( mchits.begin(), mchits.end(), start_time );
300 auto end_iter = std::upper_bound ( mchits.begin(), mchits.end(), end_time );
304 double reco_q =
hit.PeakAmplitude();
309 double abs_dt_min = 1e9;
312 while(start_iter != end_iter) {
313 mc_qsum += (*start_iter).Charge(
true);
315 double dt = (*start_iter).PeakTime() - peak_time.
PeakTime();
317 if(abs_dt<0) abs_dt *= -1;
319 if(abs_dt < abs_dt_min) {
322 mc_q = (*start_iter).Charge(
true);
339 hDT_v.at (wire_id.Plane) ->
Fill ( dt_min );
345 for(
unsigned char plane=0; plane<geo->
Nplanes(); ++plane) {
346 std::cout<<mchit_mult.at(plane)<<std::endl;
349 hCorrMult_v.at (plane) ->
Fill( mchit_mult.at (plane), recohit_mult.at (plane) );
float PeakTime() const
Getter for start time.
TH1D * hMCHitSearchTimeSum
Time to search for corresponding MCHit per RecoHit summed over all RecoHits (per event) ...
void SetTime(const float peak, const float width)
Setter function for time.
void analyze(art::Event const &e) override
Declaration of signal hit object.
TNtupleSim Fill(f1, f2, f3, f4)
MCHitAnaExample(fhicl::ParameterSet const &p)
std::vector< geo::WireID > ChannelToWire(raw::ChannelID_t const channel) const
Returns a list of wires connected to the specified TPC channel.
std::vector< TH1D * > hQRatio_v
Histogram (per plane) for a ratio of RecoHit charge to the closest (in time) RecoHit charge...
std::vector< TH2D * > hCorrMult_v
Histogram (per plane) for # of MCHit vs. # of RecoHit.
TH1D * hMCHitReadTime
Time to read MCHit from disk.
std::vector< TH1D * > hDT_v
Histogram (per plane) for time-diff between one Reco hit and the closest (in time) RecoHit...
std::string fMCHitModuleName
Producer module for MCHit.
std::vector< TH1D * > hRecoHitMult_v
Histogram (per plane) for RecoHit multiplicity in each event.
unsigned int Nplanes(unsigned int tpc=0, unsigned int cstat=0) const
Returns the total number of wire planes in the specified TPC.
#define DEFINE_ART_MODULE(klass)
std::vector< TH1D * > hRecoHitQ_v
Histogram (per plane) for RecoHit charge.
std::string fRecoHitModuleName
Producer module for recob::Hit.
T get(std::string const &key) const
std::vector< TH1D * > hQSumRatio_v
EDAnalyzer(Table< Config > const &config)
std::vector< TH1D * > hMCHitMultPerRecoHit_v
Histogram (per plane) for MCHit multiplicity within start=>end time region of RecoHit.
Detector simulation of raw signals on wires.
Conversion of times between different formats and references.
std::vector< TH2D * > hCorrQ_v
Histogram (per plane) for charge of one MCHit that is closest (in time) to one RecoHit.
raw::ChannelID_t PlaneWireToChannel(WireID const &wireid) const
Returns the ID of the TPC channel connected to the specified wire.
virtual double TPCTick2TDC(double tick) const =0
Converts a TPC time tick into a electronics time tick.
TH1D * hMCHitSearchTime
Time to search for corresponding MCHit per RecoHit.
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
std::vector< TH1D * > hMCHitQ_v
Histogram (per plane) for all MCHit charge.
TH1D * hRecoHitReadTime
Time to read recob::Hit from disk.
std::vector< TH1D * > hMCHitMult_v
Histogram (per plane) for MCHit multiplicity in each event.
Namespace collecting geometry-related classes utilities.
virtual ~MCHitAnaExample()
TH1D * hAnalysisTime
Time to run analyze() function.
art framework interface to geometry description
std::vector< TH2D * > hCorrQSum_v
Histogram (per plane) for charge sum of multiple MCHit found within start=>end time of one RecoHit...
cet::coded_exception< error, detail::translate > exception
std::vector< TH1D * > hVoidHitQ_v
Histogram (per plane) for charge of some RecoHit that has no corresponding MCHit. ...