LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
TCShowerElectronLikelihood_module.cc
Go to the documentation of this file.
1 // -------------------------------------------------
2 // makes shower profile templates
3 //
4 // Author: Rory Fitzpatrick (roryfitz@umich.edu)
5 // Created: 8/3/18
6 // -------------------------------------------------
7 
8 // Framework includes
14 #include "art_root_io/TFileService.h"
16 #include "cetlib/pow.h"
17 #include "fhiclcpp/ParameterSet.h"
18 
29 
30 #include "TFile.h"
31 #include "TH1.h"
32 #include "TH3.h"
33 #include "TProfile.h"
34 #include "TProfile2D.h"
35 
36 namespace shower {
37 
39  public:
40  explicit TCShowerElectronLikelihood(fhicl::ParameterSet const& pset);
41 
42  private:
43  void beginJob() override;
44  void analyze(const art::Event& evt) override;
45 
46  void getShowerProfile(detinfo::DetectorClocksData const& clockdata,
47  detinfo::DetectorPropertiesData const& detProp,
49  TVector3 shwvtx,
50  TVector3 shwdir);
51  void findEnergyBin();
52  double getLongLikelihood();
53  double getTranLikelihood();
54 
55  void resetProfiles();
56 
57  std::string fTemplateFile;
58  std::string fROOTfile;
59 
60  TH3F* longTemplate;
61  TH3F* tranTemplate;
67  TProfile2D* longTemplateProf2D;
68  TProfile2D* tranTemplateProf2D;
69  TProfile2D* tranTemplateProf2D_1;
70  TProfile2D* tranTemplateProf2D_2;
71  TProfile2D* tranTemplateProf2D_3;
72  TProfile2D* tranTemplateProf2D_4;
73  TProfile2D* tranTemplateProf2D_5;
74 
75  //TTree* fTree;
76  TH1F* energyDist;
79  // just for printing purposes
80  TH1F* longProfHist;
86 
87  TH1F* longProfile;
88  TH1F* tranProfile;
94 
96  double energyChi2;
97  int maxt;
98 
99  const int LBINS = 20;
100  const int LMIN = 0;
101  const int LMAX = 5;
102 
103  const int TBINS = 20;
104  const int TMIN = -5;
105  const int TMAX = 5;
106 
107  const double X0 = 14;
108 
109  std::string fHitModuleLabel;
110  std::string fShowerModuleLabel;
111  std::string fTemplateModuleLabel;
112  std::string fGenieGenModuleLabel;
113  std::string fDigitModuleLabel;
114 
116 
117  }; // class TCShowerElectronLikelihood
118 
119 } // shower
120 
121 // -------------------------------------------------
122 
124  : EDAnalyzer(pset)
125  , fHitModuleLabel(pset.get<std::string>("HitModuleLabel", "trajcluster"))
126  , fShowerModuleLabel(pset.get<std::string>("ShowerModuleLabel", "tcshower"))
127  , fGenieGenModuleLabel(pset.get<std::string>("GenieGenModuleLabel", "generator"))
128  , fCalorimetryAlg(pset.get<fhicl::ParameterSet>("CalorimetryAlg"))
129 {
130  fTemplateFile = pset.get<std::string>("TemplateFile");
131  cet::search_path sp("FW_SEARCH_PATH");
132  if (!sp.find_file(fTemplateFile, fROOTfile))
133  throw cet::exception("TCShowerElectronLikelihood")
134  << "cannot find the root template file: \n"
135  << fTemplateFile << "\n bail ungracefully.\n";
136 
137  std::unique_ptr<TFile> file{TFile::Open(fROOTfile.c_str())};
138 
139  longTemplate = file->Get<TH3F>("tcshowertemplate/fLongitudinal");
140  tranTemplate = file->Get<TH3F>("tcshowertemplate/fTransverse");
141  tranTemplate_1 = file->Get<TH3F>("tcshowertemplate/fTransverse_1");
142  tranTemplate_2 = file->Get<TH3F>("tcshowertemplate/fTransverse_2");
143  tranTemplate_3 = file->Get<TH3F>("tcshowertemplate/fTransverse_3");
144  tranTemplate_4 = file->Get<TH3F>("tcshowertemplate/fTransverse_4");
145  tranTemplate_5 = file->Get<TH3F>("tcshowertemplate/fTransverse_5");
146 
147  longTemplateProf2D = file->Get<TProfile2D>("tcshowertemplate/fShowerProfileRecoLong2D");
148  tranTemplateProf2D = file->Get<TProfile2D>("tcshowertemplate/fShowerProfileRecoTrans2D");
149  tranTemplateProf2D_1 = file->Get<TProfile2D>("tcshowertemplate/fShowerProfileRecoTrans2D_1");
150  tranTemplateProf2D_2 = file->Get<TProfile2D>("tcshowertemplate/fShowerProfileRecoTrans2D_2");
151  tranTemplateProf2D_3 = file->Get<TProfile2D>("tcshowertemplate/fShowerProfileRecoTrans2D_3");
152  tranTemplateProf2D_4 = file->Get<TProfile2D>("tcshowertemplate/fShowerProfileRecoTrans2D_4");
153  tranTemplateProf2D_5 = file->Get<TProfile2D>("tcshowertemplate/fShowerProfileRecoTrans2D_5");
154 
155  longProfile = new TH1F("longProfile", "longitudinal shower profile;t;Q", LBINS, LMIN, LMAX);
156  tranProfile = new TH1F("tranProfile", "transverse shower profile;dist (cm);Q", TBINS, TMIN, TMAX);
157 
158  tranProfile_1 = new TH1F(
159  "tranProfile_1", "transverse shower profile [0 <= t < 1];dist (cm);Q", TBINS, TMIN, TMAX);
160  tranProfile_2 = new TH1F(
161  "tranProfile_2", "transverse shower profile [1 <= t < 2];dist (cm);Q", TBINS, TMIN, TMAX);
162  tranProfile_3 = new TH1F(
163  "tranProfile_3", "transverse shower profile [2 <= t < 3];dist (cm);Q", TBINS, TMIN, TMAX);
164  tranProfile_4 = new TH1F(
165  "tranProfile_4", "transverse shower profile [3 <= t < 4];dist (cm);Q", TBINS, TMIN, TMAX);
166  tranProfile_5 = new TH1F(
167  "tranProfile_5", "transverse shower profile [4 <= t < 5];dist (cm);Q", TBINS, TMIN, TMAX);
168 } // TCShowerElectronLikelihood
169 
170 // -------------------------------------------------
171 
173 {
174 
176 
177  energyDist = tfs->make<TH1F>("energyDist", "true energy - guess energy", 41, -20.5, 20.5);
178  longLikelihoodHist = tfs->make<TH1F>("longLikelihoodHist", "longitudinal likelihood", 20, 0, 2);
179  tranLikelihoodHist = tfs->make<TH1F>("tranLikelihoodHist", "transverse likelihood", 20, 0, 3);
180 
181  // just for printing purposes
182  longProfHist =
183  tfs->make<TH1F>("longProfHist", "longitudinal e- profile (reco);t;Q", LBINS, LMIN, LMAX);
184  tranProfHist_1 = tfs->make<TH1F>(
185  "tranProfHist", "transverse e- profile (reco) [0 <= t < 1];dist (cm);Q", TBINS, TMIN, TMAX);
186  tranProfHist_2 = tfs->make<TH1F>(
187  "tranProfHist", "transverse e- profile (reco) [1 <= t < 2];dist (cm);Q", TBINS, TMIN, TMAX);
188  tranProfHist_3 = tfs->make<TH1F>(
189  "tranProfHist", "transverse e- profile (reco) [2 <= t < 3];dist (cm);Q", TBINS, TMIN, TMAX);
190  tranProfHist_4 = tfs->make<TH1F>(
191  "tranProfHist", "transverse e- profile (reco) [3 <= t < 4];dist (cm);Q", TBINS, TMIN, TMAX);
192  tranProfHist_5 = tfs->make<TH1F>(
193  "tranProfHist", "transverse e- profile (reco) [4 <= t < 5];dist (cm);Q", TBINS, TMIN, TMAX);
194 
195 } // beginJob
196 
197 // -------------------------------------------------
198 
200 {
201  resetProfiles();
202 
204  std::vector<art::Ptr<recob::Hit>> hitlist;
205  if (evt.getByLabel(fHitModuleLabel, hitListHandle)) art::fill_ptr_vector(hitlist, hitListHandle);
206 
207  art::Handle<std::vector<recob::Shower>> showerListHandle;
208  std::vector<art::Ptr<recob::Shower>> showerlist;
209  if (evt.getByLabel(fShowerModuleLabel, showerListHandle))
210  art::fill_ptr_vector(showerlist, showerListHandle);
211 
212  art::Handle<std::vector<simb::MCTruth>> mctruthListHandle;
213  std::vector<art::Ptr<simb::MCTruth>> mclist;
214  if (evt.getByLabel(fGenieGenModuleLabel, mctruthListHandle))
215  art::fill_ptr_vector(mclist, mctruthListHandle);
216 
217  art::FindManyP<recob::Hit> shwfm(showerListHandle, evt, fShowerModuleLabel);
218 
219  if (showerlist.size()) {
220  auto const clock_data =
222  auto const det_prop =
224  std::vector<art::Ptr<recob::Hit>> showerhits = shwfm.at(0);
226  clock_data, det_prop, showerhits, showerlist[0]->ShowerStart(), showerlist[0]->Direction());
227 
228  maxt = std::ceil((90 - showerlist[0]->ShowerStart().Z()) / X0);
229 
230  findEnergyBin();
231 
234 
235  // check true shower energy
236  if (mclist.size()) {
237  art::Ptr<simb::MCTruth> mctruth = mclist[0];
238  if (mctruth->NeutrinoSet()) {
239  if (std::abs(mctruth->GetNeutrino().Nu().PdgCode()) == 12 &&
240  mctruth->GetNeutrino().CCNC() == 0) {
241  double elep = mctruth->GetNeutrino().Lepton().E();
242  energyDist->Fill(elep - energyGuess);
243  } // cc nue
244  } // neutrinoset
245  } // mclist
246  } // showerlist
247 
254 } // analyze
255 
256 // -------------------------------------------------
257 
259 {
260 
261  longProfile->Reset();
262  tranProfile->Reset();
263  tranProfile_1->Reset();
264  tranProfile_2->Reset();
265  tranProfile_3->Reset();
266  tranProfile_4->Reset();
267  tranProfile_5->Reset();
268 
269  energyGuess = -9999;
270  energyChi2 = -9999;
271  maxt = -9999;
272 } // resetProfiles
273 
274 // -------------------------------------------------
275 
277  detinfo::DetectorClocksData const& clockdata,
278  detinfo::DetectorPropertiesData const& detProp,
279  std::vector<art::Ptr<recob::Hit>> showerhits,
280  TVector3 shwvtx,
281  TVector3 shwdir)
282 {
283  auto const& wireReadoutGeom = art::ServiceHandle<geo::WireReadout const>()->Get();
284 
285  auto collectionPlaneID = geo::PlaneID(0, 0, 1);
286  auto const& collectionPlane = wireReadoutGeom.Plane(collectionPlaneID);
287 
288  using namespace geo::vect;
289  auto const shwvtx_p = toPoint(shwvtx);
290  auto const shwvtx_p2 = shwvtx_p + toVector(shwdir);
291 
292  double shwVtxTime = detProp.ConvertXToTicks(shwvtx_p.X(), collectionPlaneID);
293  double shwVtxWire = collectionPlane.WireCoordinate(shwvtx_p);
294 
295  double shwTwoTime = detProp.ConvertXToTicks(shwvtx_p2.X(), collectionPlaneID);
296  double shwTwoWire = collectionPlane.WireCoordinate(shwvtx_p2);
297 
298  for (size_t i = 0; i < showerhits.size(); ++i) {
299  if (showerhits[i]->WireID().Plane != collectionPlaneID.Plane) continue;
300 
301  double wirePitch = wireReadoutGeom.Plane(showerhits[i]->WireID()).WirePitch();
302  double tickToDist = detProp.DriftVelocity(detProp.Efield(), detProp.Temperature());
303  tickToDist *= 1.e-3 * sampling_rate(clockdata); // 1e-3 is conversion of 1/us to 1/ns
304 
305  double xvtx = shwVtxTime * tickToDist;
306  double yvtx = shwVtxWire * wirePitch;
307 
308  double xtwo = shwTwoTime * tickToDist;
309  double ytwo = shwTwoWire * wirePitch;
310 
311  double xtwoorth = (ytwo - yvtx) + xvtx;
312  double ytwoorth = -(xtwo - xvtx) + yvtx;
313 
314  double xhit = showerhits[i]->PeakTime() * tickToDist;
315  double yhit = showerhits[i]->WireID().Wire * wirePitch;
316 
317  double ldist = std::abs((ytwoorth - yvtx) * xhit - (xtwoorth - xvtx) * yhit + xtwoorth * yvtx -
318  ytwoorth * xvtx) /
319  std::hypot(ytwoorth - yvtx, xtwoorth - xvtx);
320  double tdist = ((ytwo - yvtx) * xhit - (xtwo - xvtx) * yhit + xtwo * yvtx - ytwo * xvtx) /
321  std::hypot(ytwo - yvtx, xtwo - xvtx);
322 
323  double to3D = 1. / std::hypot(xvtx - xtwo,
324  yvtx - ytwo); // distance between two points in 3D space is one
325  ldist *= to3D;
326  tdist *= to3D;
327  double t = ldist / X0;
328 
329  double Q = showerhits[i]->Integral() *
330  fCalorimetryAlg.LifetimeCorrection(clockdata, detProp, showerhits[i]->PeakTime());
331 
332  longProfile->Fill(t, Q);
333  tranProfile->Fill(tdist, Q);
334 
335  if (t < 1)
336  tranProfile_1->Fill(tdist, Q);
337  else if (t < 2)
338  tranProfile_2->Fill(tdist, Q);
339  else if (t < 3)
340  tranProfile_3->Fill(tdist, Q);
341  else if (t < 4)
342  tranProfile_4->Fill(tdist, Q);
343  else if (t < 5)
344  tranProfile_5->Fill(tdist, Q);
345 
346  } // loop through showerhits
347 
348  return;
349 
350 } // getShowerProfile
351 
352 // -------------------------------------------------
353 
355 {
356 
357  if (longProfile->GetNbinsX() != longTemplate->GetNbinsX())
358  throw cet::exception("TCShowerElectronLikelihood")
359  << "Bin mismatch in longitudinal profile template \n";
360 
361  if (tranProfile->GetNbinsX() != tranTemplate->GetNbinsX())
362  throw cet::exception("TCShowerElectronLikelihood")
363  << "Bin mismatch in transverse profile template \n";
364 
365  double chi2min = 999999;
366  double bestbin = -1;
367 
368  int ebins = longTemplate->GetNbinsY();
369  int lbins = longTemplate->GetNbinsX();
370  int tbins = tranTemplate->GetNbinsX();
371 
372  for (int i = 0; i < ebins; ++i) {
373  double thischi2 = 0;
374 
375  TProfile* ltemp = longTemplateProf2D->ProfileX("_x", i + 1, i + 1);
376  TProfile* ttemp_1 = tranTemplateProf2D_1->ProfileX("_x_1", i + 1, i + 1);
377  TProfile* ttemp_2 = tranTemplateProf2D_2->ProfileX("_x_2", i + 1, i + 1);
378  TProfile* ttemp_3 = tranTemplateProf2D_3->ProfileX("_x_3", i + 1, i + 1);
379  TProfile* ttemp_4 = tranTemplateProf2D_4->ProfileX("_x_4", i + 1, i + 1);
380  TProfile* ttemp_5 = tranTemplateProf2D_5->ProfileX("_x_5", i + 1, i + 1);
381 
382  int nlbins = 0;
383  int ntbins = 0;
384 
385  for (int j = 0; j < lbins; ++j) {
386  double obs = longProfile->GetBinContent(j + 1);
387  double exp = ltemp->GetBinContent(j + 1);
388  if (obs != 0) {
389  thischi2 += cet::square(obs - exp) / exp;
390  ++nlbins;
391  }
392  } // loop through longitudinal bins
393 
394  for (int j = 0; j < tbins; ++j) {
395  double obs = tranProfile_1->GetBinContent(j + 1);
396  double exp = ttemp_1->GetBinContent(j + 1);
397  if (obs != 0) {
398  thischi2 += cet::square(obs - exp) / exp;
399  ++ntbins;
400  }
401 
402  obs = tranProfile_2->GetBinContent(j + 1);
403  exp = ttemp_2->GetBinContent(j + 1);
404  if (obs != 0) {
405  thischi2 += cet::square(obs - exp) / exp;
406  ++ntbins;
407  }
408 
409  obs = tranProfile_3->GetBinContent(j + 1);
410  exp = ttemp_3->GetBinContent(j + 1);
411  if (obs != 0) {
412  thischi2 += cet::square(obs - exp) / exp;
413  ++ntbins;
414  }
415 
416  obs = tranProfile_4->GetBinContent(j + 1);
417  exp = ttemp_4->GetBinContent(j + 1);
418  if (obs != 0) {
419  thischi2 += cet::square(obs - exp) / exp;
420  ++ntbins;
421  }
422 
423  obs = tranProfile_5->GetBinContent(j + 1);
424  exp = ttemp_5->GetBinContent(j + 1);
425  if (obs != 0) {
426  thischi2 += cet::square(obs - exp) / exp;
427  ++ntbins;
428  }
429  } // loop through longitudinal bins
430 
431  thischi2 /= (nlbins + ntbins);
432 
433  if (thischi2 < chi2min) {
434  chi2min = thischi2;
435  bestbin = i;
436  }
437 
438  } // loop through energy bins
439 
440  energyChi2 = chi2min;
441  energyGuess = bestbin + 1;
442 } // findEnergyBin
443 
444 // -------------------------------------------------
445 
447 {
448  if (energyGuess < 0) return -9999.;
449  int energyBin = energyGuess;
450 
451  double longLikelihood = 0.;
452  int nbins = 0;
453 
454  for (int i = 0; i < LBINS; ++i) {
455  double qval = longProfile->GetBinContent(i + 1);
456  int qbin = longTemplate->GetZaxis()->FindBin(qval);
457  int binentries = longTemplate->GetBinContent(i + 1, energyBin, qbin);
458  int totentries = longTemplate->Integral(i + 1, i + 1, energyBin, energyBin, 0, 100);
459  if (qval > 0) {
460  ++nbins;
461  double prob = (double)binentries / totentries * 100;
462  if (binentries > 0) longLikelihood += log(prob);
463  }
464  } // loop through
465 
466  longLikelihood /= nbins;
467 
468  std::cout << longLikelihood << std::endl;
469  return longLikelihood;
470 } // getLongLikelihood
471 
472 // -------------------------------------------------
473 
475 {
476  if (energyGuess < 0) return -9999.;
477  int energyBin = energyGuess;
478 
479  double tranLikelihood_1 = 0;
480  double tranLikelihood_2 = 0;
481  double tranLikelihood_3 = 0;
482  double tranLikelihood_4 = 0;
483  double tranLikelihood_5 = 0;
484 
485  double qval;
486  int qbin, binentries, totentries;
487 
488  int nbins = 0;
489 
490  for (int i = 0; i < TBINS; ++i) {
491  qval = tranProfile_1->GetBinContent(i + 1);
492  qbin = tranTemplate_1->GetZaxis()->FindBin(qval);
493  binentries = tranTemplate_1->GetBinContent(i + 1, energyBin, qbin);
494  totentries = tranTemplate_1->Integral(i + 1, i + 1, energyBin, energyBin, 0, 100);
495  if (qval > 0) {
496  ++nbins;
497  double prob = (double)binentries / totentries * 100;
498  if (binentries > 0) tranLikelihood_1 += log(prob);
499  }
500 
501  qval = tranProfile_2->GetBinContent(i + 1);
502  qbin = tranTemplate_2->GetZaxis()->FindBin(qval);
503  binentries = tranTemplate_2->GetBinContent(i + 1, energyBin, qbin);
504  totentries = tranTemplate_2->Integral(i + 1, i + 1, energyBin, energyBin, 0, 100);
505  if (qval > 0) {
506  ++nbins;
507  double prob = (double)binentries / totentries * 100;
508  if (binentries > 0) tranLikelihood_2 += log(prob);
509  }
510 
511  qval = tranProfile_3->GetBinContent(i + 1);
512  qbin = tranTemplate_3->GetZaxis()->FindBin(qval);
513  binentries = tranTemplate_3->GetBinContent(i + 1, energyBin, qbin);
514  totentries = tranTemplate_3->Integral(i + 1, i + 1, energyBin, energyBin, 0, 100);
515  if (qval > 0) {
516  ++nbins;
517  double prob = (double)binentries / totentries * 100;
518  if (binentries > 0) tranLikelihood_3 += log(prob);
519  }
520 
521  qval = tranProfile_4->GetBinContent(i + 1);
522  qbin = tranTemplate_4->GetZaxis()->FindBin(qval);
523  binentries = tranTemplate_4->GetBinContent(i + 1, energyBin, qbin);
524  totentries = tranTemplate_4->Integral(i + 1, i + 1, energyBin, energyBin, 0, 100);
525  if (qval > 0) {
526  ++nbins;
527  double prob = (double)binentries / totentries * 100;
528  if (binentries > 0) tranLikelihood_4 += log(prob);
529  }
530 
531  qval = tranProfile_5->GetBinContent(i + 1);
532  qbin = tranTemplate_5->GetZaxis()->FindBin(qval);
533  binentries = tranTemplate_5->GetBinContent(i + 1, energyBin, qbin);
534  totentries = tranTemplate_5->Integral(i + 1, i + 1, energyBin, energyBin, 0, 100);
535  if (qval > 0) {
536  ++nbins;
537  double prob = (double)binentries / totentries * 100;
538  if (binentries > 0) tranLikelihood_5 += log(prob);
539  }
540 
541  } // loop through
542 
543  double const tranLikelihood =
544  (tranLikelihood_1 + tranLikelihood_2 + tranLikelihood_3 + tranLikelihood_4 + tranLikelihood_5) /
545  nbins;
546  std::cout << tranLikelihood << std::endl;
547  return tranLikelihood;
548 } // getTranLikelihood
549 
550 // -------------------------------------------------
551 
double E(const int i=0) const
Definition: MCParticle.h:234
int PdgCode() const
Definition: MCParticle.h:213
int CCNC() const
Definition: MCNeutrino.h:148
const simb::MCNeutrino & GetNeutrino() const
Definition: MCTruth.h:77
void getShowerProfile(detinfo::DetectorClocksData const &clockdata, detinfo::DetectorPropertiesData const &detProp, std::vector< art::Ptr< recob::Hit >> showerhits, TVector3 shwvtx, TVector3 shwdir)
Declaration of signal hit object.
const simb::MCParticle & Nu() const
Definition: MCNeutrino.h:146
double Temperature() const
In kelvin.
constexpr auto abs(T v)
Returns the absolute value of the argument.
STL namespace.
cout<< "Opened file "<< fin<< " ixs= "<< ixs<< endl;if(ixs==0) hhh=(TH1F *) fff-> Get("h1")
Definition: AddMC.C:8
EDAnalyzer(fhicl::ParameterSet const &pset)
Definition: EDAnalyzer.cc:6
Particle class.
TCShowerElectronLikelihood(fhicl::ParameterSet const &pset)
double Efield(unsigned int planegap=0) const
kV/cm
IDparameter< geo::PlaneID > PlaneID
Member type of validated geo::PlaneID parameter.
Float_t Z
Definition: plot.C:37
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:289
Utilities to manipulate geometry vectors.The utilities include generic vector interface facilities al...
const simb::MCParticle & Lepton() const
Definition: MCNeutrino.h:147
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:65
IDparameter< geo::WireID > WireID
Member type of validated geo::WireID parameter.
parameter set interface
T get(std::string const &key) const
Definition: ParameterSet.h:314
double ConvertXToTicks(double X, int p, int t, int c) const
Point_t toPoint(Point const &p)
Convert the specified point into a geo::Point_t.
double DriftVelocity(double efield=0., double temperature=0.) const
cm/us
Vector_t toVector(Vector const &v)
Convert the specified vector into a geo::Vector_t.
decltype(auto) get(T &&obj)
ADL-aware version of std::to_string.
Definition: StdUtils.h:120
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Encapsulate the construction of a single detector plane .
Contains all timing reference information for the detector.
TFile * file
Direction
Definition: types.h:12
bool NeutrinoSet() const
Definition: MCTruth.h:78
TCEvent evt
Definition: DataStructs.cxx:8
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
Definition: Ptr.h:306
void analyze(const art::Event &evt) override
double LifetimeCorrection(detinfo::DetectorClocksData const &clock_data, detinfo::DetectorPropertiesData const &det_prop, double time, double T0=0) const
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33